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

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

709990 次浏览

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

NuGet.exe您可以为每个项目运行以下命令。

nuget install packages.config

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

nuget restore YourSolution.sln

这两个都将下拉包。但是,在运行此命令时,您的项目文件不会被修改,因此项目应该已经有对NuGet包的引用。如果不是这种情况,那么您可以使用Visual Studio安装包。

使用NuGet 2.7及更高版本,Visual Studio将在您构建解决方案时自动恢复丢失的NuGet包,因此无需使用NuGet.exe.

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

通过命令行,您可以将解决方案中的包更新到nuget.org.

nuget update YourSolution.sln

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

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

Update-Package

您也可以将其限制为一个项目。

Update-Package -Project YourProjectName

如果您想将软件包重新安装到与之前安装的版本相同的版本,那么您可以使用-reinstall参数和Update-Package命令。

Update-Package -reinstall

您也可以将其限制为一个项目。

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的信息

在Visual Studio中还有另一种更新更快的方法来执行此操作。查看David Ebbo的这篇文章,如果遇到麻烦,请参考注释部分。基本上,您可以在包管理器提示符中执行以下操作:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

之后,当您构建解决方案时,如果缺少软件包,则会自动安装它们。

更新时间:

此功能内置于Nuget 1.6中,并与Visual Studio集成,因此您甚至不需要安装NuGetPowerTools或键入命令。您所要做的就是

右键单击解决方案资源管理器中的解决方案节点并选择 启用NuGet包还原。

阅读这篇文章了解更多详情。

如果您使用的是网站项目,或者不想启用NuGet包还原,这里有另一种解决方案。

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

# 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) }

随着最新的NuGet 2.5版本,包管理器中现在有一个“全部更新”按钮:http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once

开放包管理器控制台

  • 查看->其他Windows->包管理器控制台

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

Update-Package -Reinstall

重新安装当前解决方案(多亏了单性ashes999)的特定项目中的所有软件包:

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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

现在,Visual Studio 2012中的Nuget包管理器控制台会自动为您提供“恢复”按钮,只要它找到任何未安装的包,但在package.config. 很棒的功能!

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

但这不会让你一路走-我在启用恢复功能后遇到了类似的问题。(VS2013,NuGet 2.8。)

事实证明,我在提交项目时(无意中)将包提交给了源代码控制—— Visual Studio(和源代码控制插件)在执行签入时帮助忽略了二进制文件。

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

  • 包文件夹和.nupkg文件都在那里——所以NuGet认为没有任何东西可以恢复;
  • 但与此同时,没有一个DLL存在——即第三方引用丢失了——所以我无法构建。

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

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

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

我还注意到Update-Package -reinstall将修改.sln.csproj/.vbproj文件。至少在我的情况下是这样做的。在我看来,这使得这个选项不那么有吸引力。

在VS2012 V11中,如果我在行的末尾使用“-Reinstall”,它将不起作用。

所以我简单地使用:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

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

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

$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) }

如果您安装Nuget 2.8,请选中复选框

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

在Visual Studio中。如果选中,则只需重建项目即可恢复所有参考库。

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

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

你可能会遇到下一个错误:

无法定位nuget.exe

要解决这个问题:更改NuGet.targets文件中的这一行并将其设置为true:

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

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

对于那些由于构建服务器因此而到达这里的人,您可以创建一个MSBuild目标,运行exec命令来运行Nuget恢复命令,如下所示(在这种情况下nuget.exe在. nuget文件夹中,而不是在路径上),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行

<Target Name="BeforeBuild">
<Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

经过三个小时的搜索和调查。

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

之后,我遇到了与PO相同的问题,也无法将我的API项目发布到服务器。

在和我刚刚使用

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

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

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

更新包-项目名称'NameOfProject'-重新安装-在包管理器控制台上运行此命令

此命令将重新安装与您在“-ProjectName”之后指定的项目相关的所有软件包。我认为这更好,因为我已经等待了半个小时才能在解决方案中重新安装所有软件包。

非常感谢Rodolpho Brock

此外,我建议您,当您从远程服务器拉取更改时,按Visual Studio将显示的“还原包”按钮。

在Visual Studio 2017中-当您使用IDE编译时-它将下载所有丢失的nuget包并保存在文件夹“包”中。

但是在构建机器上编译是使用msbuild.exe.在这种情况下,我下载了nuget.exe.

在执行之前的每个构建过程中msbuild.exe.它将执行->nuget.exe恢复NAME_OF_SLN_File(如果只有一个. SLN文件,则可以忽略该参数)。

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

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

希望能对别人有用:

$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] }

编辑: 这是我犯的一个错误: Update-Package:找不到包“EntityFramework. BulkInsert-ef6”。必须在执行安装或更新之前恢复现有包。 手动运行 Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 效果很好

不知道从什么时候开始,但在VS2019中,你可以用更简单的方式做到这一点:

  1. 右键单击解决方案资源管理器中的解决方案
  2. 选择管理解决方案的Nuget包
  3. 有4个选项卡,浏览,安装,更新,合并
  4. 合并显示是否有任何项目使用不同版本的包(在大多数情况下,这就是我们想要更新所有包的原因)
  5. 更新显示任何项目中是否有可用的更新。选择全部并单击更新,工作将完成。