【问题标题】:C# grandchild project DLLs not included in msbuild packagemsbuild 包中不包含 C# 孙项目 DLL
【发布时间】:2018-09-07 15:35:34
【问题描述】:

我有一个 C# 项目 X,它引用了一个 C# 项目 Y,它引用了一个 C# 项目 Z。所以依​​赖链看起来像这样:X => Y => Z。没有直接/显式依赖 X => Z。当我使用 msbuild 命令构建要发布的包时

msbuild DesignService.csproj /m /p:Configuration="Debug" /p:Platform="AnyCPU" /verbosity:quiet /t:Package /p:PackageLocation=X.zip /p:PackageAsSingleFile=True

我得到一个 zip 文件,其中包含 X 和 Y 的 DLL,但没有 Z。然后当包发布(到 Azure 应用服务)时,当调用 Z 中的代码时,我得到运行时错误,说 DLL找不到。如果我在 X 中添加 Z 作为直接/显式引用,它就可以正常工作。但我认为我不应该这样做。

如何在我的发布包中从 msbuild 获取 Z 的 DLL,而不在 X 中添加显式引用?

【问题讨论】:

  • 我在本地复制了这个。我使用 Azure API 应用程序作为我的 .csproj。然后我在使用 msbuild 打包时遇到了和你类似的问题。我可以通过转到 Visual Studio > 右键单击​​项目 > 属性 > 打包/发布 Web > 要部署的项目 > 更改为“此项目中的所有文件”来解决这个问题。
  • @P.Brian.Mackey 谢谢,但我已经将它设置为“此项目文件夹中的所有文件”,范围更广。
  • @P.Brian.Mackey 这似乎是相关的,但我不确定我可以从中获取哪些可操作的项目,尤其是因为它仍然处于打开状态。
  • 有一些解决方法可以帮助您解决问题。如果是同一个问题,很高兴知道错误报告已经存在。

标签: c# dll msbuild dependencies azure-web-app-service


【解决方案1】:

为什么会发生这种情况

X.csproj 被调用,因为它有一个对 Y.csproj 的项目引用,所以它调用了 Y.csproj——它“绕到后面”。 Z.csproj 尚未构建,因此构建中断。

如何解决

遵循这个原则:根本不要使用解决方案文件中表达的依赖关系。

您可以在项目中添加项目引用。 它看起来像这样——注意元数据元素,当然所有这些都在<ItemGroup> 标签内:

<ProjectReference Include=”… foo.csproj”> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference>

尽管必须以这种方式编辑项目以消除错误很烦人,但最好使用项目引用来代替,并将解决方案文件视为一个“视图”。

您最终会得到可以在没有解决方案文件的情况下构建的项目。

有关如何解决问题的更多详细信息,您可以参考blog

【讨论】:

  • 在我的问题中,我是 msbuilding 一个 csproj,而不是解决方案,所以这是否相关?您可以编辑您的答案以明确建议的编辑进入哪个 csproj 吗? X.csproj 对吗?
  • 您不应该使用 sln 文件来构建包。这个答案更多地是关于带有构建目标而不是包目标的 msbuild。这不相关。如果有的话,OP应该走相反的方向并独立构建每个包。这是解决问题的方法。
【解决方案2】:

没有直接的方法可以做到这一点,即使这个问题已经在 msbuild 中多次提出。就变通方法而言,最流行的是利用“Z”项目程序集(在“X”项目中从“Z”项目创建某个类的虚拟实例)或在“X”项目到“Z”项目。

blog 解释了我认为最干净的解决方法。从本质上讲,它涉及创建一个单独的.targets 文件,该文件只不过是 msbuild 的说明,以确保在构建和打包 DLL 时,它还包括所有传递依赖项。然后需要将此 .targets 文件添加到您的 X.csproj 文件中,以便在使用 msbuild 构建它时,调用此目标文件。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多