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

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

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

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

 nuget install packages.config 

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

 nuget restore YourSolution.sln 

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

使用NuGet 2.7及更高版本,Visual Studio将在您构build解决scheme时自动恢复丢失的NuGet包,因此不需要使用NuGet.exe。

要更新解决scheme中的所有软件包,首先恢复它们,然后可以使用NuGet.exe来更新软件包,或者从Visual Studio中您可以从软件包pipe理器控制台窗口更新软件包,或者最后您可以使用“pipe理包对话框。

从命令行,您可以将解决scheme中的软件包更新到nuget.org提供的最新版本。

 nuget update YourSolution.sln 

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

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

 Update-Package 

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

 Update-Package -Project YourProjectName 

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

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

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

 Update-Package -Reinstall 

重新安装当前解决scheme的SPECIFIC PROJECT中的所有软件包( 感谢unarity和ashes999 ):

 Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall 

还有另外一种更新,更快捷的方式,可以在Visual Studio中执行此操作。 大卫·艾博(David Ebbo)看看这篇文章 ,如果遇到麻烦,请参阅评论部分。 基本上,你在包pipe理器提示符下执行以下操作:

 PM> Install-Package NuGetPowerTools PM> Enable-PackageRestore 

之后,当你build立你的解决scheme时,软件包会自动安装,如果他们错过了。

更新:

这个function是通过Visual Studio集成到Nuget 1.6中的 ,所以你甚至不需要安装NuGetPowerTools或者input命令。 所有你需要做的是

右键单击Solution Explorer中的Solution节点,然后selectEnable NuGet Package Restore。

阅读这篇文章的更多细节。

如果您正在使用网站项目,或者不想启用NuGet包恢复,那么这里有另一个解决scheme。

您可以使用软件包pipe理器控制台来枚举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) } 
 Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall 

这是我find的最好也是最简单的例子。 它将重新安装在packages.config中列出的所有工具,它将保留当前版本。 用项目名称replaceYourProjectNameGoesHere

使用最新的NuGet 2.5版本,软件包pipe理器中现在有一个“全部更新”button: http : //docs.nuget.org/docs/release-notes/nuget-2.5#​​Update_All_button_to_allow_updating_all_packages_at_once

我正在使用visual studio 2015,上面给出的解决scheme不适合我,所以我做了以下几点:

从解决scheme中删除软件包文件夹,并从解决scheme中的每个项目中删除bin和obj文件夹,并为其重build。

也许你会有下一个错误:

无法findnuget.exe

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

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

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

我相信你需要做的第一件事是启用程序包恢复function 。 另见这里 。 这是在解决scheme(不是项目)级别完成的。

但是,这不会让你一路发生 – 启用恢复function后,我遇到了类似的问题。 (VS2013,NuGet 2.8。)

事实certificate,当我提交项目时,我(无意中)将包提交给源代码控制, Visual Studio(和源代码pipe理插件)在执行签入时已经有助于忽略二进制文件。

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

  • 包文件夹和.nupkg文件都在那里 – 所以NuGet不认为有什么要恢复;
  • 但与此同时,没有任何DLL存在 – 即第三方引用丢失 – 所以我不能build立。

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

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

免责声明:我在这里看到另一个答案,这表明清除packages文件夹是决议的一部分。 这使我走上正轨,所以我想给作者信用,但我不能再find这个问题/答案。 如果我偶然发现,我会发布一个修改。

我还会注意到Update-Package -reinstall会修改.sln.csproj / .vbproj文件。 至less这就是我的情况。 哪个恕我直言,使这个选项更不具吸引力。

如果您安装了Nuget 2.8,请选中checkbox

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

在Visual Studio中。 如果检查,那么只需重build项目将恢复所有的参考库。

现在,Visual Studio 2012中的Nuget包pipe理器控制台会立即为您提供“还原”button,只要它find任何未安装的包,但是在package.config中。 真棒特征!

在VS2012 V11中,如果在行末使用“-Reinstall”,则不起作用。

所以我简单地使用:

 Update-Package -ProjectName 'NAME_OF_THE_PROJECT' 

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

编辑2014-09-25 10:55 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) } 

对于那些由于构build服务器而造成这种情况的人,可以创build一个运行exec命令的MSBuild目标来运行nuget restore命令,如下所示(在这种情况下,nuget.exe位于.nuget文件夹中,而不是该path),然后可以在构build解决scheme之前立即在TeamCity构build步骤中运行

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

经过3个小时的search和调查。

我有问题,因为我们在团队中有两个成员(使用GitHub源代码pipe理),因为我们没有限制用于发送到远程存储库的包的文件,团队成员之一是发送包到服务器,我已经把这些变化我的本地。

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

在和我刚刚使用

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

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

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

Update-Package -ProjectName'NameOfProject'-Reinstall – 在软件包pipe理器控制台上运行此命令

该命令将重新安装与“-ProjectName”之后指定的项目相关的所有软件包。 而且我认为这样更好,因为我等了半个小时才将所有软件包重新安装到解决scheme中。

感谢Rodolpho Brock 。

此外,我会build议你,当你从远程服务器拉改变,按“恢复包”button,将由Visual Studio显示。