如何让NuGet安装/更新packages.config中的所有软件包?

How do I get NuGet to install/update all the packages in the packages.config?

我有一个包含多个项目的解决方案。大多数第三方引用都丢失了,但是每个项目都有packages.config文件。如何让Nuget安装/更新所需的所有软件包?这是否需要通过每个项目的命令行来完成?


您可以使用nuget.exe还原包,或者安装nuget 2.7或更高版本,您可以在Visual Studio中简单地编译解决方案,这也将还原丢失的包。

对于nuget.exe,可以为每个项目运行以下命令。

1
nuget install packages.config

或者使用nuget 2.7,您可以使用命令行恢复解决方案中的所有包。

1
nuget restore YourSolution.sln

这两个都会把包裹拉下来。但是,在运行此命令时,不会修改项目文件,因此项目应该已经有了对nuget包的引用。如果不是这样,则可以使用Visual Studio安装软件包。

对于nuget 2.7及更高版本,在构建解决方案时,Visual Studio将自动还原丢失的nuget包,因此无需使用nuget.exe。

要更新解决方案中的所有包,请首先还原它们,然后可以使用nuget.exe更新包,或者在Visual Studio中,可以从包管理器控制台窗口更新包,或者最后使用"管理包"对话框。

从命令行,您可以将解决方案中的包更新为nuget.org提供的最新版本。

1
nuget update YourSolution.sln

请注意,这不会在任何nuget包中运行任何PowerShell脚本。

在Visual Studio中,还可以使用包管理器控制台更新包。这样做的好处是,任何PowerShell脚本都将作为更新的一部分运行,因为使用nuget.exe时不会运行它们。以下命令将每个项目中的所有包更新为nuget.org提供的最新版本。

1
Update-Package

您还可以将此限制为一个项目。

1
Update-Package -Project YourProjectName

如果要将包重新安装到以前安装的版本,则可以将-reinstall参数与Update-Package命令一起使用。

1
Update-Package -reinstall

您还可以将此限制为一个项目。

1
Update-Package -reinstall -Project YourProjectName

-reinstall选项将首先卸载软件包,然后将其重新安装到项目中。

或者,您可以使用Manage Packages对话框更新包。

更新:

  • 2013/07/10-更新了nuget 2.7中的nuget恢复信息
  • 2014/07/06-更新了有关Visual Studio中自动包还原的信息,并将答案与Nuget的其他更改一起更新。
  • 2014/11/21-更新了有关-reinstall的信息


在当前解决方案的所有项目中重新安装所有包:

1
Update-Package -reinstall

在当前解决方案的特定项目中重新安装所有包(由于unarity和ashes999):

1
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall


在Visual Studio中,还有另一种更新和快速的方法可以做到这一点。看看大卫埃博的这篇文章,如果你遇到麻烦,参考评论部分。基本上,在包管理器提示中执行以下操作:

1
2
PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

之后,当您构建解决方案时,如果软件包丢失,它们将自动安装。

更新:

此功能内置于带有Visual Studio集成的nuget 1.6中,因此您甚至不需要安装nugetpowertools或type命令。你所要做的就是

Right click on the Solution node in Solution Explorer and select
Enable NuGet Package Restore.

阅读本文了解更多详细信息。


如果您正在使用网站项目,或者不想启用Nuget包还原,这里还有另一个解决方案。

您可以使用包管理器控制台枚举package.config文件中的所有包并重新安装它们。

1
2
3
4
5
# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }


1
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

这是我发现的最好和最简单的例子。它将重新安装packages.config中列出的所有nuget,并保留当前版本。将YourProjectNameGoesHere替换为项目名称。


在最新的nuget 2.5版本中,软件包管理器中现在有一个"全部更新"按钮:http://docs.nuget.org/docs/release notes/nuget-2.5 update all button允许一次性更新所有软件包


我正在使用Visual Studio 2015,上面给出的解决方案对我不起作用,因此我执行了以下操作:

从我的解决方案中删除packages文件夹,从解决方案中的每个项目中删除bin和obj文件夹,并对其进行重建。

可能会出现下一个错误:

unable to locate nuget.exe

要解决此问题,请在nuget.targets文件中更改此行并将其设置为true:

1
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == ''">true</DownloadNuGetExe>

参考:https://stackoverflow.com/a/30918648和https://stackoverflow.com/a/20502049


经过3小时的搜索和调查。

我遇到了一些问题,因为我们在团队中有两个成员(使用Github源代码管理),因为我们没有限制要发送到远程存储库的包的文件,其中一个团队成员将包发送到服务器,我已经将这些更改拉到了本地。

之后,我遇到了和po相同的问题,也无法将api项目发布到服务器上。

在和我刚用过

更新包-重新安装-在包管理器控制台上运行此命令

此命令将重新安装解决方案中使用的所有包。(每个项目)

在当前解决方案的所有项目中重新安装所有包:

更新包-projectname'nameofproject'-重新安装-在包管理器控制台上运行此命令

此命令将重新安装与在"-projectname"之后指定的项目相关的所有包。我认为这更好,因为我等了半个小时才重新安装解决方案中的所有包。

感谢Rodolpho Brock。

另外,我建议您在从远程服务器提取更改时,按Visual Studio将显示的"还原包"按钮。


我认为您需要做的第一件事是启用包恢复功能。另请参见此处。这是在解决方案(而不是项目)级别完成的。

但这并不能让您完全理解——在启用了恢复功能之后,我遇到了类似的问题。(VS2013,Nuget 2.8.)

结果是我提交项目时(无意中)将包提交给了源代码管理——但是Visual Studio(和源代码管理插件)在执行签入时忽略了二进制文件。

当我创建一个发布分支时,问题就出现了。我的dev/main/trunk分支的本地副本有二进制文件,因为这是我最初安装/下载包的地方。但是,在新的发布分支中,

  • 包文件夹和.nupkg文件都在那里——所以nuget认为没有任何要恢复的内容;
  • 但同时,没有任何DLL存在——也就是说,第三方引用丢失了——所以我无法构建。

我删除了$(SolutionDir)/packages中的所有包文件夹(在发布分支下),然后运行了一个完整的重建,这次构建成功了。…然后,我当然返回并从源代码管理中删除了包文件夹(在主干和发布分支中)。我还不清楚是否应该删除repositories.config文件。

项目模板(至少对于Web项目)为您安装的许多组件都是nuget包。也就是说,这个问题不限于您添加的包。因此,在创建项目/解决方案后,在执行初始签入之前,请立即启用包恢复,清除packages文件夹(并确保将.nuget文件夹提交到源代码管理)。

免责声明:我在这里看到了另一个答案,表明清除packages文件夹是解决方案的一部分。这使我走上了正确的道路,所以我想给作者一个评价,但我再也找不到那个问题/答案了。如果我偶然发现了它,我会发布一篇编辑文章。

我还注意到Update-Package -reinstall将修改.sln.csproj.vbproj文件。至少在我的案例中是这样的。而imho使这个选项更不具有吸引力。


如果未安装2.8,请选中复选框。

1
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

在Visual Studio中。如果选中该选项,则只需重新生成项目即可恢复所有引用库。


对于由于生成服务器与此冲突而到达此处的用户,可以创建一个运行exec命令的msbuild目标来运行nuget restore命令,如下所示(在本例中,nuget.exe位于.nuget文件夹中,而不是在路径上),然后可以在生成解决方案之前立即在teamcity生成步骤中运行。

1
2
3
4
<Target Name="BeforeBuild">
  <Exec Command="..\.nuget
uget restore ..\MySolution.sln"/>
</Target>


我尝试了Update-Package -reinstall,但它在一个包上失败了,并且停止处理我的解决方案中所有剩余的项目包。

最后,我用自己的脚本枚举了所有package.config文件,并为每个项目/包运行Update-Package -Reinstall -ProjectName prj -Id pkg

希望它对某人有用:

1
2
3
4
5
6
$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

编辑:这是我犯的一个错误:更新包:找不到包"EntityFramework.BulkInsert-EF6"。在执行安装或更新之前,必须还原现有包。手动运行Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6工作得很好。


在VS2012 v11中,如果在行尾使用"-reinstall",它将不起作用。

所以我只使用了:

1
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

我知道这是一篇旧文章,但我认为这可能有用。如果在更新过程中需要忽略特定的包(如任何更新javascript引用的包),请使用以下PowerShell脚本(确保包管理器控制台中的包源设置为"all"):

编辑2014-09-25 10:55 AM EST-修复脚本中的错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$packagePath ="packages.config"
$projectName ="MyProjectName"

$packagesToIgnore = @(
   "bootstrap",
   "jQuery",
   "jquery-globalize",
   "jquery.mobile",
   "jQuery.jqGrid",
   "jQuery.UI.Combined",
   "jQuery.Validation",
   "Microsoft.jQuery.Unobtrusive.Validation",
   "Modernizr",
   "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }

现在,Visual Studio 2012中的nuget package manager控制台会在找到任何未安装但在package.config中已安装的包时自动为您提供一个"还原"按钮。太棒了!


在Visual Studio 2017中(使用IDE编译时),它将下载所有丢失的nuget包并保存在"packages"文件夹中。

但在生成计算机上,编译是使用msbuild.exe完成的。在这种情况下,我下载了nuget.exe。

在执行msbuild.exe之前的每个生成过程中。它将执行->nuget.exe restore name_sln_file(如果只有一个.sln文件,则可以忽略该参数)。