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

时间:2016-06-29 20:41:24

标签: c# visual-studio tfs nuget nuget-package-restore

我已经阅读了SO和NuGet(以及一般的互联网)上的许多答案,但我似乎无法克服我在Visual Studio 2015中使用NuGet包恢复时遇到的问题。我有以下内容场景。

解决方案A结构

- 项目A

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

解决方案B结构

- 项目A

- 项目B

但是,假设我从未构建过解决方案A(即从TFS中提取新内容),如果我打开并构建解决方案BI,请参阅显示nuget包恢复进度的对话框,但构建失败,因为项目A无法构建。

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

几点:

  • 我已经禁用了NuGet的源代码控制集成,因此我没有在Packages文件夹中进行检查。
  • 每个项目都有自己的packages.config文件
  • 解决方案B中的构建顺序是项目A,然后是项目B

我们将非常感谢您的想法。

3 个答案:

答案 0 :(得分:5)

默认情况下,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的速度要快很多。)

答案 1 :(得分:2)

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

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

我希望,这会有所帮助。

答案 2 :(得分:0)

取自OPs问题

howcheng's answer通常是正确的,但有一些警告。在实施了howcheng建议的更改之后,我能够使用中央软件包在本地构建我的所有解决方案&#39;无论解决方案如何,所有项目都会查看的文件夹。我遇到的问题是,当我将这些更改检查到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中包含的版本。一旦我从TFS Tools目录运行nuget update -self我的构建工作正常。