在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

非常感谢。

在Visual Studio 2015解决方案中恢复所有Nuget包

默认情况下,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,我的构建就能正常工作。