我试图理解为什么删除项目引用会阻止我的构建下载它需要的所有 NuGet 包。这是使用 Visual Studio 2019
- 应用程序 A (.NET 5) 拥有对程序集 B 的项目引用。
- 程序集 B 使用 NuGet 包 C。
- 构建开始时,会自动下载 NuGet 包 C。
这都是普通的预期,.NET 的东西。
但后来我意识到 A 实际上并没有使用任何 B 特定的类型。 B 是一个 Prism 模块,仅当用户拥有许可证并单击按钮时才会动态加载。所以 A 甚至并不总是加载“B”。
所以我删除了 A 对 B 的项目引用。我不希望 future 的开发人员意外地认为他们可以开始引用 B 中的类型。(我们并不总是发布所有模块)。从技术上讲,现在解决方案中没有项目包含对 B 的引用。但它仍然是构建的一部分。我确实设置了构建依赖项,以便 B 仍会在 A 之前构建,但不再有项目引用..
然后我做了一个干净的构建。 Visual Studio 表示已成功完成。我看到组件 B 已经构建完成。但构建过程没有检索 NuGet 包 C(B 所依赖的包)。测试表明,除非应用程序 A 实际上拥有对 B 的项目引用,否则它不会检索 C。
有办法解决这个问题吗?如果我正在构建所有程序集,为什么 MSBuild 不下载所有程序集依赖的 NuGet 包。我可以更改一些设置来实现它吗?
最佳答案
回答我自己的问题,以防其他人遇到此问题:
我向微软提出了这个问题。他们说这种行为是设计使然:如果 DLL 生成程序集(“B”)使用 NuGet 包,则在构建时下载该包的唯一方法是生成 EXE 的程序集是否具有 项目引用到 B。仅具有构建依赖项是不够的。
没有解释原因。我仍然认为由于我在上面的问题和评论中提到的原因,行为应该有所不同。他们说这是 .NET 团队的问题并将其转交给他们。我终于收到回复说,我可以通过向我的程序集 B 的项目文件添加一个属性(名为 CopyLocalLockFileAssemblies
)来实现此行为。
所以我就这么做了。添加了这个:
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
而且它成功了。将此属性设置为 true 时,需要 NuGet 包的程序集将在输出文件夹中获取该程序集,无论是否有人拥有对该程序集的项目引用。
(有人可能会说这是一个 RTFM 类问题。但是学习 MSBuild 及其细节是我“最终需要做”的众多事情之一)
关于visual-studio - Visual Studio Build 不会下载所有没有项目引用的 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69576545/