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

Restoring all Nuget Packages in a Visual Studio 2015 Solution

我已经阅读了很多关于 SO 和 NuGet(以及整个互联网,真的)的答案,但我似乎无法解决我在 Visual Studio 2015 年使用 NuGet 包还原时遇到的问题.我有以下场景。

解决方案 A 结构

--项目A

如果我打开并构建解决方案 A,我会看到显示 nuget 包恢复进度的对话框,并且解决方案构建成功。

解决方案 B 结构

--项目A

--项目B

但是,假设我从未构建过解决方案 A(即来自 TFS 的新拉取),如果我打开并构建解决方案 B,我会看到显示 nuget 包恢复进度的对话框,但构建失败,因为项目 A 失败建造。

似乎正在发生的事情是 NuGet 正在恢复项目 B 的包,而不是项目 A 的包,因此构建失败。到目前为止,如果我查看项目 B 的引用,所有 NuGet 引用都已解决,但项目 A 的引用仍然损坏。

几点:

如有想法,将不胜感激。

默认情况下,NuGet 在解决方案根目录中创建解决方案的 packages 文件夹,每个项目将其包 DLL 引用到该 "local" 包文件夹。在您的示例中,如果您打开项目 A 的 .csproj 文件,您可能会看到参考路径类似于 ..\packages\[package name]\[etc].

因此,当您从 TFS 重新提取并构建解决方案 B 时,项目 A 无法找到其 DLL,因为 c:\workspace\Solution A\packages 尚不存在(或者您计算机上的任何绝对路径)。

要更正此问题,请使用创建于 c:\workspace\packages 的共享包文件夹。为此,您必须在每个解决方案中向 NuGet.config 添加一个附加节点(有关详细信息,请参阅 https://docs.nuget.org/consume/nuget-config-file;我还假设您在 c:\workspace\Solution A\.nuget 处有一个 NuGet 文件夹):

<config>
  <add key="repositorypath" value="..\..\packages" />
</config>

这里我用的是相对路径,但是你也可以用绝对路径,文档说你也可以用%HOME%

执行此操作,然后重新启动 Visual Studio。下次打开包管理器时,它会询问您是否要恢复丢失的包,假设您单击是,它会将它们放在新位置。最后一步是编辑 .csproj 文件并将 ..\packages 的所有实例更改为 ..\..\packages(或者您可以卸载并重新安装包,但我发现编辑 .csproj 的速度更快)。

要恢复 nuget 包,请执行以下步骤:

  • 在项目属性中更改目标框架
  • 清理项目
  • 设置上一个目标框架
  • 重建项目

希望对你有所帮助。

取自 OP 问题

通常是正确的,但有一些注意事项。实施 howcheng 建议的更改后,我能够使用所有项目查看的中央 'packages' 文件夹在本地构建我的所有解决方案,无论解决方案如何。我 运行 遇到的问题是,当我将这些更改检查到 TFS 时,我的 CI 构建开始但失败了!

我的 CI 构建定义构建解决方案 A 和解决方案 B 作为默认 XAML 过程模板的一部分,而不是 .proj 文件。我看到的错误似乎表明解决方案 A 正在恢复其包,但解决方案 B 没有。如果我登录构建服务器并在 VS 2015 中打开解决方案 B,一切正常;在谷歌上搜索了几个小时后,我看到了 this 篇文章,最终引导我找到了答案。

我在 Visual Studio 2015 年开发,但我使用 TFS 2013 进行源代码控制和构建。尽管我在构建服务器上安装了 Visual Studio 2015,但 MSBuild 仍然引用 TFS 2013 附带的 NuGet 版本,而不是 VS 2015 附带的版本。一旦我 运行 nuget update -self 从 TFS 工具目录我的构建工作正常。