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


674

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


10
请考虑更改接受的答案,因为NuGet现在已与Visual Studio集成得多,并且有更简便的方法来解决此问题。
skolima 2012年

2
随着最新的NuGet 2.5版本现在有在包管理器“全部更新”按钮:docs.nuget.org/docs/release-notes/...
埃里克Schierboom

@ErikSchierboom谢谢!此线程应该更新,因为它现在可用
Karl Cassar

相关项目:Chocolatey.org
Jayan 2014年

1
为了使搜索者受益,在VS2013中,您可以右键单击该解决方案,然后选择“启用NuGet软件包还原”。然后建立。
HockeyJ 2014年

Answers:


870

您可以使用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 restore的信息
  • 2014/07/06-更新了有关Visual Studio中程序包自动还原的信息,并通过对NuGet的其他更改使答案保持最新。
  • 2014/11/21-更新了有关的信息-reinstall

15
在Visual Studio中是否有一些简单的命令可以做到这一点?我为解决方案启用了自动恢复功能,但是由于缺少引用(未从packages.config恢复软件包),“ Build”仍然给我很多错误。
Borek Bernard'3

1
如果不安装类似NuGet Power Tools-github.com/davidfowl/NuGetPowerTools之类的东西,我不会这样。但是,这基本上与您已经拥有的自动恢复功能相同。
马特·沃德

2
通常,这也适用于安装软件包,而不仅仅是“还原”它们(在恢复IS安装方面没有太大的技术差异;但不限于要使用解决方案软件包还原功能的人员)。但是,您确实需要为此设置环境变量EnableNuGetPackageRestore。我在调用“ nuget installpackages.config”之前在psake脚本中进行设置,如下所示:$ env:EnableNuGetPackageRestore =“ true”。这将为PS进程及其产生的进程设置var,而不会影响机器范围的变量(可能还会影响其他构建)。
galaktor

还原与安装并不完全相同。从命令行安装软件包不会更改您的项目,因此不会添加程序集引用之类的内容。
马特·沃德

3
我肯定花了至少一个小时的时间来寻找解决方案,但最终的确是Update-Package -reinstall -Project ProjectName
Wiz

529

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

Update-Package -Reinstall

在当前解决方案的SPECIFIC PROJECT中重新安装所有软件包(由于unarityashes999):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
我认为这确实是OP想要的,并且比所有其他解决方案都更容易...
jaminto

4
如果您只需要它现在就可以工作,则这是nuke选项。
克里斯,

11
如果您刚刚更改了目标框架或类似框架,这也是一个完美的选择。我面临着必须更新25个奇怪的项目的前景,这些项目周围散布着大量的nuget程序包,第一个命令非常适合我的需求。甚至在过度杀伤力方面也不是核武器。
克里斯

7
这应该是该问题的答案,可接受的答案确实有效,但这专门回答了问题。+1正是需要的东西。
krystan荣誉2014年

10
您甚至可能想要添加-IgnoreDependencies开关。我有一个更新,包失败,因为我用比我packages.config指定一个新的版本中存在一个程序包的依赖
马蒂亚斯法尔肯贝里

167

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

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

更新:

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

右键单击“解决方案资源管理器”中的“解决方案”节点,然后选择“启用NuGet软件包还原”。

阅读本文以获取更多详细信息。


6
对于大多数人来说,这里更新的答案将是最好的解决方案,因为他们没有nuget.exe(但将nuget安装到Visual Studio中)。
Tod Thomson

1
但是,软件包还原实际上为您下载了nuget.exe
Konstantin

4
我就是这么做的 而且仍然无法通过构建说引用丢失。Build说所有的软件包都已经安装好了。我去了solution / packages文件夹,删除了有问题的软件包,然后下载并开始工作。
马斯洛

3
@Shy现在已弃用这种方式,而采用了不会修改您所有项目文件的解决方案。
松饼人

20

如果您正在使用网站项目,或者不想启用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) }

4
我尝试了以上每个答案,但无法使它们适用于我的解决方案之一。但是,做了一个变体。 $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
如果您在同一个csproj上使用多个解决方案,则nuget软件包还原是一场噩梦。
felickz

1
这不能解决我的问题,但可以肯定让我感觉更好!
魔鬼的拥护者

这非常好,它提供了一种将程序包迁移到新项目的方法:[xml] $ packages = gc c:\ PathToExisting \ packages.config#接着是#安装每个程序包$ packages.packages.package | %{Install-Package -id $($ _。id)-Version $($
_。version

1
@PerryJ您可能刚刚输入Update-Package -Reinstall
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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


我有一些问题,因为我的packages.config包含对两个具有特定版本的软件包的引用,但是一个软件包依赖于另一个没有特定版本的软件包。当我运行更新时,它首先卸载了所有软件包,然后重新安装失败,因为“已引用”了较新版本的依赖项。虽然删除工作正常,所以现在我的packages.config为空。在尝试完整更新之前,我必须从源代码控制还原package.config并更新有冲突的软件包...
Mathias Falkenberg 2014年


7

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

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

也许您会遇到下一个错误:

无法找到nuget.exe

解决此问题的方法:在NuGet.targets文件中更改此行并将其设置为true:

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

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


4

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

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

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


Visual Studio UI中最方便的选项。您还需要选中该Allow NuGet to download missing packages复选框。
RBT

4

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

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

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

在和我刚用过的

更新包-重新安装 -在Package Manager控制台上运行此命令

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

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

更新包-ProjectName'NameOfProject'-重新安装 -在Package Manager控制台上运行此命令

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

非常感谢Rodolpho Brock

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


3

我相信您需要做的第一件事就是启用软件包还原功能。另请参阅此处。这是在解决方案(而非项目)级别完成的。

但这并不能完全解决问题-启用还原功能后,我遇到了类似的问题。(VS2013,NuGet 2.8。)

事实证明,当我提交项目时,我(无意间)将包提交给了源代码管理- 但是 Visual Studio(和源代码管理插件)在执行签入时已经有效地忽略了二进制文件。

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

  • 软件包文件夹和.nupkg文件都在这里-因此NuGet认为没有任何可恢复的东西;
  • 但是同时,没有DLL出现-即缺少第三方引用-因此我无法构建。

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

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

免责声明:我在SO上看到了另一个答案,它表明清除packages文件夹是解决方案的一部分。这使我走上了正确的道路,因此我想赞扬作者,但我无法再找到该问题/答案。如果偶然发现,我将发布编辑内容。

我还要注意,这Update-Package -reinstall将修改.sln.csproj/ .vbproj文件。至少这就是我的情况。哪个恕我直言使该选项的吸引力大大降低。


我遇到了完全相同的问题,并且花了很长时间升级和重新安装软件包,就像您所说的那样,要做的就是删除本地软件包。
Thomas Boby 2015年

3

我尝试过,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] }

编辑: 这是我有一个错误: 更新包:无法找到包'EntityFramework.BulkInsert-ef6'。在执行安装或更新之前,必须还原现有软件包。 手动运行 Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 效果很好。


2
谢谢。我喜极而泣
Cleftheris

我也高兴地哭了!是!!节省时间。就像供您参考,如果您使用此行而不是Sergei脚本的最后一行,它也不会安装依赖项。只需直接重新安装:$ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

对于由于构建服务器受到污染而到达此处的用户,可以创建一个运行exec命令的MSBuild目标以运行nuget restore命令,如下所示(在这种情况下,nuget.exe在.nuget文件夹中,而不是路径),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行

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

1

现在,Visual Studio 2012中的Nuget软件包管理器控制台会在您在package.config中找到未安装但位于其中的任何软件包时自动为您提供“还原”按钮。很棒的功能!


2
这是Visual Studio 2010中也是如此
paulroho

1

在VS2012 V11上,如果我在行尾使用“ -Reinstall”,则该行不通。

所以我简单地使用:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

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

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

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

1

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

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

0

在Visual Studio 2017中-当您使用IDE进行编译时-它会下载所有缺少的nuget程序包并将其保存在“程序包”文件夹中。

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

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


我发现您可以在命令行上的SLN上使用MSBuild -t:restore来执行此操作。 MSbuild -t:restore Xxxx.sln
迈克·凯利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.