在Visual Studio 2015解决方案中恢复所有Nuget包
本文关键字:Nuget 恢复 Visual Studio 2015 解决方案 | 更新日期: 2023-09-27 17:53:07
我已经阅读了许多关于SO和NuGet的答案(以及一般的互联网,真的),但我似乎无法克服我在Visual Studio 2015中使用NuGet包恢复的问题。我有以下场景。
方案A结构
——项目
如果我打开并构建解决方案A,我将看到显示nuget包恢复进度和解决方案成功构建的对话框。
方案B结构
——项目
——项目B
然而,假设我从未构建解决方案A(即从TFS新拉),如果我打开并构建解决方案B,我看到显示nuget包恢复进度的对话框,但构建失败,因为项目A未能构建。
似乎发生的是NuGet正在为项目B恢复软件包,而不是为项目A恢复软件包,因此构建失败。重点是,如果我查看项目B的引用,所有的NuGet引用都已经解决了,但项目A的引用仍然是坏的。
几点说明:
- 我已经禁用了NuGet的源代码控制集成,所以我没有检查Packages文件夹。
- 每个项目都有自己的包。配置文件
- 方案B中的构建顺序是项目A然后项目B
非常感谢。
默认情况下,NuGet在解决方案根目录下创建解决方案的packages
文件夹,并且每个项目将其包dll引用到该"本地"包文件夹。在您的示例中,如果您打开项目A的.csproj文件,您可能会看到引用路径类似于..'packages'[package name]'[etc]
。
所以当你从TFS做一个新的拉并构建解决方案B时,项目a找不到它的dll,因为c:'workspace'Solution A'packages
还不存在(或者无论你的机器上的绝对路径是什么)。
要纠正这个问题,请使用在c:'workspace'packages
创建的共享包文件夹。为此,您必须向NuGet添加一个额外的节点。在每个解决方案中配置(参见https://docs.nuget.org/consume/nuget-config-file了解详细信息;我也假设你有一个NuGet文件夹在c:'workspace'Solution A'.nuget
):
<config>
<add key="repositorypath" value="..'..'packages" />
</config>
我在这里使用了一个相对路径,但是你也可以使用一个绝对路径,文档说你也可以使用%HOME%
。
执行此操作,然后重新启动Visual Studio。下次打开包管理器时,它应该询问您是否要恢复丢失的包,假设您单击yes,它将把它们放在新位置。最后一步是编辑.csproj文件并将..'packages
的所有实例更改为..'..'packages
(或者您可以卸载并重新安装该包,但我发现编辑.csproj要快得多)。
按以下步骤恢复nuget包:
- 更改项目属性中的目标框架
- 清洁项目
- 设置前一个目标框架
- 重建项目
摘自OPs的问题
howcheng的回答总体上是正确的,但有一些注意事项。在实现了howcheng建议的更改之后,我能够使用一个所有项目都可以查看的中央"packages"文件夹在本地构建所有解决方案,而不管解决方案是什么。但我遇到的问题是,当我将这些更改签入TFS时,我的CI构建启动并失败了!
我的CI构建定义将解决方案A和解决方案B作为默认XAML过程模板的一部分构建,而不是一个.proj文件。我看到的错误似乎表明解决方案A正在恢复其软件包,但解决方案B没有。如果我登录到构建服务器并在VS 2015中打开解决方案B,一切都很好;在谷歌上搜索了几个小时后,我看到了这篇文章,它最终引导我找到了我的答案。
我正在Visual Studio 2015中开发,但我使用TFS 2013进行源代码控制和构建。尽管我在构建服务器上安装了Visual Studio 2015,但MSBuild仍然引用了与TFS 2013一起发布的NuGet版本,而不是与VS 2015一起包含的版本。一旦我从TFS Tools目录中运行nuget update -self
,我的构建就能正常工作。