我知道这是一个以前讨论过的问题,但我有一个我不明白的情况。
我有以下项目
项目 A 有一个对项目 B 的 Visual Studio 引用。我在项目 B 的代码中使用这两个包,并且正在调试模式下构建。项目 B 配置如下所示。
<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>
*为什么只有 log4net 中的 dll 文件复制到项目 A 的 bin 文件夹中,而不复制 Client 和 Core 文件?任何帮助或解释表示赞赏! *
为了准确回答您的问题,我们需要了解一些事情。
一种解释取决于您在项目 A 中拥有哪些参考资料。例如,项目 A 除了引用项目 B 之外,还可能包含其他引用,其中有
Microsoft.ApplicationServer.Caching.Client
和 Microsoft.ApplicationServer.Caching.Core
,可能将选项 Copy local
设置为 false
- 但不是 log4net
。在这种情况下,前两者的复制只会发生在项目 B 中。
另一种可能的解释取决于 您的代码如何处理项目 A 和项目 B 中的引用。MSBuild 进程不会自动复制项目中实际未使用的引用程序集。
最后,如果您依赖构建事件来复制引用,请查看“输出”面板,以确保尽管编译成功但没有错误。
无论如何,为了确保复制所有 NuGet 包,我发现编辑
.csproj
文件并在 <PropertyGroup>
标签中添加以下内容很有用:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
来自文档:
如果将此
设置为 true,则任何 NuGet 包依赖项都会复制到输出目录。这意味着您可以使用 dotnet build 的输出在任何计算机上运行您的插件。CopyLocalLockFileAssemblies
根据其文档,
<CopyLocalLockFileAssemblies>
将任何显式链接的 NuGet 依赖项复制到项目的输出目录中。自然地,如果您希望项目 A 在其输出目录中拥有 NuGet dll 的副本,但项目 A 不会复制它,因为例如它属于上述第一种或第二种情况,那么选项可以是:
<CopyLocalLockFileAssemblies>
。这不是灵丹妙药,即如果错误在于例如上面概述的第三种情况。
我也遇到了同样的问题,有一个复杂的依赖图。
我认为这与 NuGet 无关。它应该与引用在 Visual Studio 或 MSBuild 中的工作方式相关。如果您只是引用 ProjectB 中的库,它不会显示在 ProjectA 的 bin 文件夹中。但是,当您使用引用库中的某种类型时,只有这样它才会显示在 bin 文件夹中。
我来到这里正是遇到了上面提到的问题。结果我重命名了包的程序集名称(因为网络升级,原始开发人员将框架名称放在项目名称中),并且仅将其安装到项目 A 而不是项目 B 中,这意味着该包没有被复制到项目 B 的 bin 文件夹,因为提示路径已更改