【问题标题】:Visual Studio Build does not download all NuGet packages without a project reference如果没有项目参考,Visual Studio Build 不会下载所有 NuGet 包
【发布时间】:2021-12-03 04:13:07
【问题描述】:

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

  • 应用程序 A (.NET 5) 包含对程序集 B 的项目引用。
  • 程序集 B 使用 NuGet 包 C。
  • 开始构建时,会自动下载 NuGet 包 C。

这完全符合预期,.NET 的东西。

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

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

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

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

【问题讨论】:

  • 您能描述一下您如何将程序集 B 设置为构建依赖项吗?
  • 我使用了“项目依赖”对话框。具体来说,在解决方案资源管理器中,我右键单击应用程序 A 的项目,然后从上下文菜单中选择 Build Dependencies >> Project Dependencies。这将我带到“项目依赖关系”对话框。在那里,我确保在“项目”下拉列表中选择“A”时,在其他项目列表中选中“B”
  • 嗨,乔,感谢您的解释。程序集 B 是否基于 .NET?我进行了测试,但我无法在我这边重现您的问题。你提到 NuGet C 被下载,那么它是下载到哪里的? ...\.nuget\packages 文件夹?或者还有什么地方?如果您可以分享可重现的简单样本或一些详细的步骤/信息,我愿意进行测试。
  • 这两个项目都是 C# 并且基于 .NET 5。在构建到解决方案构建输出文件夹的过程中,程序集由 Visual Studio(我猜是 MSBuild...?)自动下载。每个项目将其输出定向到一个公共文件夹。例如,对于发布版本,它们都将Build >> Output 路径设置为..\..\x64\Release 对于调试版本,它是..\..\x64\Debug。由于我正在为 Windows 构建,构建会自动在每个名为 net5.0-windows 的位置创建一个子目录。所有的输出二进制文件,包括 NuGet 的,最终都在那里
  • 我能够在测试应用程序中重现它。创建了一个 WPF.NET 5 应用程序。向其中添加了一个 WPF .NET 5 类库程序集。使程序集引用了 NuGet 包(我选择了一个名为“无状态”的包,可在 NuGet .org 获得)。如上所述,使两者都将输出发送到公共输出文件夹。还将两者都更改为仅在 x64 上构建而不是“AnyCpu”(不确定是否重要)。使应用程序对程序集具有构建依赖性。如果我构建,则不会下载任何内容。如果应用程序具有对程序集的项目引用,则 stateless.dll 将出现在输出文件夹中

标签: visual-studio nuget .net-5


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2016-02-15
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多