构建服务器上的NuGet包还原无法工作

21

我已经在我的解决方案中设置了NuGet Package Restore,并且在我的本地计算机上可以很好地工作。 我按照此处提供的说明进行操作:

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

我的问题出现在我的构建服务器上,出现以下错误:

默认情况下禁用软件包还原。 要同意,请打开Visual Studio选项对话框,单击“包管理器”节点,然后选中“允许NuGet在构建期间下载缺少的软件包”。 您也可以通过将环境变量“EnableNuGetPackageRestore”设置为“true”来同意。

不幸的是,我无法访问构建服务器,因为它受到站外控制,无法更新环境变量。 是否有其他方法解决这个问题? 我可以向解决方案文件或类似文件添加任何内容以允许软件包还原吗?

9个回答

15

试试这个包:

Install-Package NuGetEnablePackageRestore 

谢谢 - 这个包需要安装在解决方案中的所有项目上还是只需要安装在主要项目(例如 Web 应用程序)上? - amateur
1
您可以安装一次,然后按照库包管理器控制台中出现的说明进行操作。完成说明后,您可以再次卸载它。 - Xavier Decoster
1
使用巧妙的解决方法,在构建过程中设置所需的“EnableNuGetPackageRestore”环境变量。 - Dan Esparza
使用服务器上的SET语句,并通过控制面板应用环境变量对我没有起作用,但这个方法可以 :) @XavierDecoster 一个问题 - 为什么我要再次卸载它?这不会导致构建失败吗? - Fetchez la vache
因为该软件包将把PowerShell脚本注入到您的NuGet PowerShell配置文件中 :) 它不会破坏构建,因为构建不依赖于此软件包,该软件包仅在VS Package Manager控制台中添加了一个新的PowerShell命令。 - Xavier Decoster

14
NuGet可以使用本地设置来控制其行为,如果您不确定服务器的配置,这可能会导致不可预测的结果。
我建议将NuGet设置放在版本控制和单一位置的/.nuget/NuGet.targets文件中。只需对/.nuget/NuGet.targets文件进行三个快速编辑即可实现此目的,编辑后的内容如下所示:
更改1:
<!-- Enable the restore command to run before builds -->
<RestorePackages Condition="  '$(RestorePackages)' == '' ">true</RestorePackages>

更改2:

<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">false</RequireRestoreConsent>

我的评论:逻辑有些笨拙,但是把“需要同意不等于假必须为真”(原文)理解为“需要同意等于真必须为真”(翻译),最后一部分改成“false”(编辑)就有意义了。
更改3:我还添加/取消注释了<PackageSource ... >标签,以消除对依赖项的任何依赖。
<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <PackageSource Include="https://nuget.org/api/v2/" />        
</ItemGroup>

2
谢谢Sid提供的解决方案 - 这个方案对我有用,而Xavier的修复方法则没有。 - Ben Barreth

5

当我试着使用Jenkins构建我的一个项目时,我遇到了这个问题。通过简单地将.nuget\NuGet.targets文件中的一个值从true更改为false,我成功地解决了它。

我做了如下更改:

<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

to

<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">false</RequireRestoreConsent>

注意元素值已经改变。 希望这可以帮助。


这对我很有用,因为我的msbuild服务器不在本地。我的解决方案有20多个项目,其中一个最近添加了一些自定义包(log4net、json.net),它导致了问题。 - jpgrassi

1
在 %appdata%\NuGet\NuGet.Config 中添加以下部分:

    <packageRestore>
    <!-- Package Restore and MSBuild-Integrated Package Restore -->
    <add key="enabled" value="True" />

    <!-- Automatic Package Restore in Visual Studio -->
    <add key="automatic" value="True" />
  </packageRestore>

完整示例
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <activePackageSource>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </activePackageSource>
  <packageRestore>
    <!-- Package Restore and MSBuild-Integrated Package Restore -->
    <add key="enabled" value="True" />

    <!-- Automatic Package Restore in Visual Studio -->
    <add key="automatic" value="True" />
  </packageRestore>
</configuration>

0

我可以尝试在.nuget\NuGet.targets文件中将RestorePackages属性设置为true:

<RestorePackages Condition="  '$(RestorePackages)' == '' ">true</RestorePackages>

刚刚尝试了一下,可惜没起作用,不过还是感谢你的建议。 - amateur
你有检查 csproj 文件属性 <RestorePackages>true</RestorePackages> 吗? - asa
在解决方案中的所有项目中? - amateur
1
我相信所有使用NuGet的项目。顺便说一句,你也可以尝试本地还原包:只需从FS中删除所有包,并尝试运行“msbuild yoursolution.sln”命令。它应该会显示更多细节。 - asa
1
该项目有超过30个子项目,因此需要编辑每个子项目并不理想。感谢您的建议。 - amateur
你可以先为 Web 项目设置还原包,然后再发布它。 - asa

0

安装包 NuGetEnablePackageRestore


0

运行以下命令以修复NuGet启用包:

Install-NuGetEnablePackageRestoreFix

然后运行启用命令:

Install-Package NuGetEnablePackageRestore


做得好!谢谢!(提示:必须安装NuGetEnablePackageRestore) - leon22

0

对于任何偶然发现这个问题的人,寻找一种在构建服务器上恢复软件包的方法,NuGet Package Restore提供了当前选项的良好概述。

我选择使用命令行软件包还原方法。只需执行以下命令即可:

C:><path to nuget.exe> restore <path to solution.sln>

可以从https://docs.nuget.org/consume/installing-nuget获取nuget.exe。我使用的是版本命令行实用程序最新版3.X


-2

-前往工具->库包管理器->"包还原" ->取消选中"允许NuGet下载缺失的包"和"自动检查..."

  • 重新生成解决方案

  • 清理解决方案

  • 现在选中"允许NuGet下载缺失的包"和"自动检查..."

  • 重新生成解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接