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

时间:2011-07-29 17:23:42

标签: nuget

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

17 个答案:

答案 0 :(得分:799)

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

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

nuget install packages.config

NuGet 2.7 you can restore all packages in the solution使用命令行。

nuget restore YourSolution.sln

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

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

要更新解决方案中的所有软件包,请先恢复它们,然后您可以使用NuGet.exe更新软件包,也可以在Visual Studio中从Package Manager控制台窗口更新软件包,或者最后可以使用“管理包”对话框。

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

nuget update YourSolution.sln

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

在Visual Studio中,您可以使用Package Manager Console来更新软件包。这样做的好处是,任何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
  • 的信息

答案 1 :(得分:493)

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

Update-Package -Reinstall

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

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

答案 2 :(得分:167)

在Visual Studio中还有另一种更新,更快捷的方法。查看David Ebbo的this post,如果遇到问题,请参阅评论部分。基本上,您在程序包管理器提示符中执行以下操作:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

<强>更新

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

  

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

阅读this article了解详情。

答案 3 :(得分:18)

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

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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

答案 5 :(得分:10)

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

答案 6 :(得分:6)

我使用Visual Studio 2015,上面给出的解决方案对我没有用,所以我做了以下工作:

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

也许你会有下一个错误:

  

无法找到nuget.exe

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

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

参考:https://msdn.microsoft.com/en-us/library/565w213d.aspxhttps://stackoverflow.com/a/30918648

答案 7 :(得分:4)

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

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

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

在我刚刚使用

Update-Package -Reinstall - 在程序包管理器控制台上运行此命令

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

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

Update-Package -ProjectName'NameOfProject'-Upgrade - 在程序包管理器控制台上运行此命令

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

非常感谢Rodolpho Brock

此外,我建议您从远程服务器提取更改时,按下Visual Studio将显示的“恢复包”按钮。

答案 8 :(得分:3)

我相信你需要做的第一件事就是enable the package restore feature。另见here。这是在解决方案(非项目)级别完成的。

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

事实证明,当我提交项目时,我(无意中)将包提交到源代码控制 - Visual Studio(和源代码控制插件)在执行检查时有助于忽略二进制文件-in。

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

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

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

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

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

我还要注意Update-Package -reinstall会修改.sln.csproj / .vbproj个文件。至少在我的案例中它做了什么。哪个恕我直言使这个选项的吸引力降低了。

答案 9 :(得分:3)

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

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
在Visual Studio中

。如果选中它,那么只需重建项目即可恢复所有参考库。

答案 10 :(得分:2)

我尝试了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 工作得很好。

答案 11 :(得分:2)

对于那些由于构建服务器违反此规定而到达此处的人,您可以创建一个运行exec命令的MSBuild目标来运行 nuget restore 命令,如下所示(在本例中为nuget.exe)在.nuget文件夹中,而不是在路径上),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:1)

我知道这是一个老帖子,但认为这可能有用。如果您需要在更新过程中忽略特定的包(例如更新JavaScript引用的任何包),请使用以下PowerShell脚本(确保您的包源设置为&#34;所有&#34;在包管理器控制台中) :

编辑2014-09-25美国东部时间上午10:55 - 修正了剧本中的错误

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

答案 14 :(得分:1)

在VS2012 V11,如果我使用&#34; -Reinstall&#34;在它的最后,它不起作用。

所以我只是用了:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

答案 15 :(得分:1)

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

答案 16 :(得分:0)

在Visual Studio 2017中 - 当您使用IDE进行编译时 - 它将下载所有缺少的nuget包并保存在文件夹&#34; packages&#34;。

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

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