Visual Studio Build 不会在没有项目引用的情况下下载所有 NuGet 包

Visual Studio Build does not download all NuGet packages without a project reference

我想了解为什么删除项目引用会阻止我的构建下载它需要的所有 NuGet 包。这是 Visual Studio 2019

这就是预期的一切,.NET 内容。

但后来我意识到 A 实际上并没有使用任何 B 特定的类型。 B 是一个 Prism 模块,只有在用户拥有它的许可证并单击按钮时才会动态加载。所以A甚至不总是加载“B”。

所以我删除了 A 对 B 的项目引用。我不希望某些未来的开发人员意外地认为他们可以开始引用 B 中的类型。(我们不会一直发布所有模块)。现在从技术上讲,解决方案中没有项目引用 B。但它仍然是构建的一部分。我确实设置了构建依赖项,以便 B 仍会在 A 之前构建,但不再有项目引用..

然后我做了一个干净的构建。 Visual Studio 表示成功完成。我看到组装 B 已经建成。但是构建过程没有检索到 NuGet 包 C(B 所依赖的包)。测试表明它不会检索 C,除非应用程序 A 实际上持有对 B 的项目引用。

有什么办法解决这个问题吗?如果我正在构建所有程序集,为什么 MSBuild 不会下载所有依赖于程序集的 NuGet 包。是否有一些我可以更改的设置来实现它。

回答我自己的问题以防其他人遇到此问题:

我问过微软的这个问题。他们说这种行为是设计使然:如果生成 DLL 的程序集(“B”)使用 NuGet 包,那么在构建时下载该包的唯一方法是如果生成 EXE 的程序集具有 对B的项目参考。仅具有构建依赖性是不够的。

没有解释为什么。我仍然认为由于我在上面的问题和评论中提到的原因,行为应该有所不同。他们说这是 .NET 团队的问题,并将其提交给他们。我终于得到一个回复​​说,我可以通过向程序集 B 的项目文件添加一个属性(名为 CopyLocalLockFileAssemblies)来实现此行为。

所以我做到了。添加了这个:

<PropertyGroup>
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

它奏效了。将此属性设置为 true 后,需要 NuGet 包的程序集将在输出文件夹中获取该程序集,无论是否有人对它有项目引用。

(有人可能会说这是一个 RTFM 类的问题。但是学习 MSBuild 及其细节是我“最终需要做”的众多事情之一)