【发布时间】: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