在 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 文件夹。
- 每个项目都有自己的 packages.config 文件
- 解决方案 B 中的构建顺序是项目 A,然后是项目 B
如有想法,将不胜感激。
默认情况下,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 工具目录我的构建工作正常。
我已经阅读了很多关于 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 文件夹。
- 每个项目都有自己的 packages.config 文件
- 解决方案 B 中的构建顺序是项目 A,然后是项目 B
如有想法,将不胜感激。
默认情况下,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 问题
我的 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 工具目录我的构建工作正常。