来自nuget包的一些dll不会复制到/ bin

Eri*_*son 8 nuget visual-studio-2012

我知道这是一个以前讨论过的问题,但我有一个我不明白的情况.

我有以下项目

  • 项目A.
    • 项目B.
      • NuGet包"log4net"
      • NuGet包"ServerAppFabric.Client"

项目A有一个Visual Studio对项目B的引用.我在项目B的代码中使用这两个包,我正在调试模式下构建.Project B config看起来像这样.

<Reference Include="log4net">
  <HintPath>..\packages\log4net.2.0.0\lib\net40-full\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationServer.Caching.Client">
  <HintPath>..\packages\ServerAppFabric.Client.1.1.2106\lib\Microsoft.ApplicationServer.Caching.Client.dll</HintPath>
</Reference>
<Reference Include="Microsoft.ApplicationServer.Caching.Core">
  <HintPath>..\packages\ServerAppFabric.Client.1.1.2106\lib\Microsoft.ApplicationServer.Caching.Core.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

*为什么只有log4net的dll文件被复制到Project A的bin文件夹而不是Client和Core文件?任何帮助或解释表示赞赏!*

ale*_*a87 12

为了准确回答您的问题,我们需要了解一些事情。

一种解释取决于您在项目 A 中拥有哪些参考文献。例如,项目 A 除了引用项目 B 之外,还可能包含其他引用,其中有Microsoft.ApplicationServer.Caching.ClientMicrosoft.ApplicationServer.Caching.Core,可能选项Copy local设置为false- 但不是log4net。在这种情况下,前两者的复制只会发生在项目 B 中。

另一种可能的解释取决于您的代码对项目 A 和项目 B 中的引用执行的操作。MSBuild 进程不会自动复制项目中实际未使用的引用的程序集。

最后,如果您依赖构建事件来复制引用,请查看“输出”面板,以确保尽管编译成功但没有错误。

无论如何,为了确保复制所有 NuGet 包,我发现编辑.csproj文件并在<PropertyGroup>标签中添加以下内容很有用:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
Run Code Online (Sandbox Code Playgroud)

文档中:

如果将此设置CopyLocalLockFileAssemblies为 true,则任何 NuGet 包依赖项都会复制到输出目录。这意味着您可以使用 dotnet build 的输出在任何计算机上运行您的插件。

根据其文档,<CopyLocalLockFileAssemblies>将任何显式链接的 NuGet 依赖项复制到项目的输出目录中。自然地,如果您希望项目 A 在其输出目录中拥有 NuGet dll 的副本,但项目 A 不复制它,因为例如它属于上述第一种或第二种情况,那么选项可以是:

  1. 确保项目A中安装了NuGet包;
  2. 添加<CopyLocalLockFileAssemblies>到项目 A 的 csproj 文件中。

这不是灵丹妙药,即如果错误在于上述第三种情况,则它将不起作用。


Osc*_*das 5

我对某个复杂的依赖图有同样的问题.

  1. 转到参考属性并设置Copy Local = True.
  2. 编译并检查程序集是否已复制到bin文件夹.
  3. 如果这不能解决您的问题,请尝试以下答案:https://stackoverflow.com/a/19889803/1074245


Ufu*_*arı 4

我认为这与 NuGet 无关。它应该与引用在 Visual Studio 或 MSBuild 中的工作方式相关。如果您只是引用 ProjectB 中的库,它不会显示在 ProjectA 的 bin 文件夹中。但是,当您使用引用库中的某种类型时,只有这样它才会显示在 bin 文件夹中。