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

如何让NuGet安装/更新packages.config中的所有软件包?,nuget,Nuget,我有一个包含多个项目的解决方案。缺少大多数第三方引用,但每个项目都有packages.config文件如何让NuGet安装/更新所需的所有软件包?是否需要通过每个项目的命令行执行此操作?您可以使用来恢复软件包,或者在安装了NuGet 2.7或更高版本的情况下,您只需在Visual Studio中编译解决方案,也可以恢复丢失的软件包 对于NuGet.exe,可以为每个项目运行以下命令 nuget install packages.config 或者使用命令行 nuget restore Your

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

您可以使用来恢复软件包,或者在安装了NuGet 2.7或更高版本的情况下,您只需在Visual Studio中编译解决方案,也可以恢复丢失的软件包

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

nuget install packages.config
或者使用命令行

nuget restore YourSolution.sln
这两个都会拉下包裹。但是,在运行此命令时不会修改项目文件,因此项目应该已经有了对NuGet包的引用。如果不是这样,那么您可以使用VisualStudio安装软件包

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

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

通过命令行,您可以将解决方案中的包更新为最新版本,此版本可从nuget.org获得

nuget update YourSolution.sln
Update-Package
请注意,这不会在任何NuGet软件包中运行任何PowerShell脚本

在VisualStudio中,您还可以使用更新包。这样做的好处是,任何PowerShell脚本都将作为更新的一部分运行,而使用NuGet.exe时不会运行它们。下面的命令将把每个项目中的所有包更新为nuget.org上提供的最新版本

nuget update YourSolution.sln
Update-Package
您还可以将此限制为一个项目

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

Update-Package -reinstall
您还可以将此限制为一个项目

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

或者,您可以使用
管理软件包
对话框更新软件包

更新:

  • 2013/07/10-更新了nuget 2.7中有关nuget还原的信息
  • 2014/07/06-更新了有关Visual Studio中自动包还原的信息,并通过对NuGet的其他更改更新了答案
  • 2014/11/21-更新了有关
    的信息-重新安装

    • 在VisualStudio中,还有另一种更新、更快的方法可以实现这一点。查看David Ebbo,如果遇到问题,请参考评论部分。基本上,您可以在Package Manager提示符中执行以下操作:

      PM> Install-Package NuGetPowerTools
      PM> Enable-PackageRestore
      
      之后,当您构建解决方案时,如果软件包丢失,将自动安装这些软件包

      更新:

      此功能通过visual studio集成内置在Nuget 1.6中,因此您甚至不需要安装NuGetPowerTools或键入命令。你所要做的就是

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


      阅读以了解更多详细信息。

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

      您可以使用package manager控制台枚举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版本中,软件包管理器中现在有一个“全部更新”按钮:

      打开软件包管理器控制台

      • 查看->其他窗口->软件包管理器控制台
      在当前解决方案的所有项目中重新安装所有软件包:

      Update-Package -Reinstall
      
      在当前解决方案的特定项目中重新安装所有软件包(感谢和):


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

      现在,Visual Studio 2012中的Nuget Package Manager控制台在Package.config中发现任何未安装的包时,会自动为您提供一个“还原”按钮。
      太棒了

      我相信你需要做的第一件事是。另见。这是在解决方案(而不是项目)级别完成的

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

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

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

      • 包文件夹和
        .nupkg
        文件都在那里——因此NuGet认为没有任何东西需要恢复
      • 但同时,没有一个DLL存在——也就是说,缺少第三方引用——因此我无法构建
      我删除了
      $(SolutionDir)/packages
      (在发行版分支下)中的所有包文件夹,然后运行了一次完整的重建,这次重建成功了。
      ... 然后我当然返回并从源代码管理中删除了包文件夹(在主干和发布分支中)。我还不清楚是否应该删除
      repositories.config
      文件

      为y安装的许多组件
      Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
      
      <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
      
      <Target Name="BeforeBuild">
        <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
      </Target>
      
      $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] }