visual-studio - Visual Studio Build 不会下载所有没有项目引用的 NuGet 包

标签 visual-studio nuget .net-5

我试图理解为什么删除项目引用会阻止我的构建下载它需要的所有 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/

相关文章:

c++ - 构建 Qt - NMAKE : fatal error U1077: 'cd' : return code '0x2'

asp.net-core - 在 ASP.NET Core 5.0 应用程序中托管 GRPC 服务和 REST Controller

.net - 隔离的 Azure 函数 Dockerfile

azure - Azure 应用服务中的 RavenDB Cloud 证书问题

c# - 如何在VS2012中获取多个锁而不弄乱缩进

visual-studio - MVVM 轻量级片段不会在 Visual Studio 中显示为实时模板

c# - 禁用错误声音 visual studio 2012

.net - Nuget:当前环境没有打开的解决方案

powershell - NuGet install.ps1 脚本中的 $package 和 $project 参数包含什么?

.net - Nuget 和 Git 集成