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

Sam*_*l G 649 nuget

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

Mat*_*ard 844

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

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

nuget install packages.config
Run Code Online (Sandbox Code Playgroud)

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

nuget restore YourSolution.sln
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

nuget update YourSolution.sln
Run Code Online (Sandbox Code Playgroud)

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

在Visual Studio中,您可以使用程序包管理器控制台来更新程序包.这样做的好处是,任何PowerShell脚本都将作为更新的一部分运行,因为使用NuGet.exe将无法运行它们.以下命令将每个项目中的所有包更新为nuget.org提供的最新版本.

Update-Package
Run Code Online (Sandbox Code Playgroud)

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

Update-Package -Project YourProjectName
Run Code Online (Sandbox Code Playgroud)

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

Update-Package -reinstall
Run Code Online (Sandbox Code Playgroud)

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

Update-Package -reinstall -Project YourProjectName
Run Code Online (Sandbox Code Playgroud)

-reinstall选项将首先卸载,然后再将软件包重新安装到项目中.

或者,您可以使用Manage Packages对话框更新包.

更新:

  • 2013/07/10 - 更新了NuGet 2.7中有关nuget恢复的信息
  • 2014/07/06 - 更新了有关Visual Studio中自动程序包还原的信息,并将答案更新为NuGet的其他更改.
  • 2014/11/21 - 更新了有关的信息-reinstall

  • 在Visual Studio中有一些简单的命令来执行此操作吗?我已经为解决方案启用了自动恢复,但是"Build"仍然因为缺少引用而导致了很多错误(包尚未从packages.config中恢复). (15认同)
  • 我必须花费至少一个小时来寻找解决方案,最后确实是`Update-Package -reinstall -Project ProjectName` (3认同)
  • 如果不安装 NuGet Power Tools - https://github.com/davidfowl/NuGetPowerTools 之类的东西,我不这么认为。但是,这将与您已经拥有的自动恢复做本质上相同的事情。 (2认同)
  • 这也适用于一般安装软件包,而不仅仅是"恢复"它们(没有重大的技术差异,如恢复IS安装;但它不仅限于那些想要使用解决方案包恢复功能的人).但是,您需要为此目的设置环境变量EnableNuGetPackageRestore.我在调用"nuget install packages.config"之前在我的psake脚本中设置它,如下所示:$ env:EnableNuGetPackageRestore ="true".这将设置PS进程及其生成的进程的var,而不会影响机器范围的变量(以及可能的其他构建). (2认同)

Rod*_*ock 511

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

Update-Package -Reinstall
Run Code Online (Sandbox Code Playgroud)

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

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Run Code Online (Sandbox Code Playgroud)

  • 我认为这真的是OP想要的,并且比其他所有解决方案都更容易...... (59认同)
  • 如果您刚刚更改了目标框架或类似内容,这也是完美的选择.我面临的前景是不得不更新25个奇怪的项目,其中包含大量的nuget软件包,第一个命令非常适合我想要的东西.而且甚至在矫枉过正的意义上也没有. (11认同)
  • 您甚至可能想要添加-IgnoreDependencies开关.我有一个更新程序包失败,因为我使用的其中一个程序包的依赖项存在于比我的packages.config中指定的更新的版本中 (9认同)
  • 这应该是这个问题的答案,接受的答案确实有效,但这具体回答了这个问题.+1正是所需要的. (7认同)
  • 如果您只是需要它现在正常工作,这是核武器选项. (4认同)

Ale*_*lex 167

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

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

右键单击Solution Explorer中的Solution节点,然后选择Enable NuGet Package Restore.

阅读本文了解更多详情.

  • 这里更新的答案将成为大多数人的最佳解决方案,因为他们没有nuget.exe(但将在Visual Studio中安装nuget). (5认同)
  • 我刚刚这样做了 并且它仍然无法构建说缺少引用.Build说已经安装了所有软件包.我去了解决方案/ packages文件夹,删除了有问题的软件包,然后下载了它们并开始工作. (4认同)
  • @Shy这种方式现在已被弃用,而不支持不修改所有项目文件的解决方案. (3认同)

Dav*_*tin 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) }
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了上面的每个答案,无法让他们在我的一个解决方案上工作.但是这个的变化确实如此.`$ packages.packages.package | %{Update-Package -reinstall -id $($ _.id)}` (4认同)

una*_*ity 15

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*oom 10

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

  • 此外,从程序包管理器控制台,您可以运行"Update-Package"来执行项目中的所有程序包:http://nuget.codeplex.com/wikipage?title = Updating%20All%20Packages (2认同)

mej*_*l57 6

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

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

也许你会有下一个错误:

无法找到nuget.exe

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

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
Run Code Online (Sandbox Code Playgroud)

参考:https://stackoverflow.com/a/30918648/sf/answers/1435143461/


Dav*_*vid 5

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

但这并不能让你一切顺利——我在启用恢复功能后遇到了类似的问题。(VS2013、NuGet 2.8。)

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

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

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

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

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

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

我还要注意,这Update-Package -reinstall将修改.sln.csproj/.vbproj文件。至少在我的例子中它就是这样做的。恕我直言,这使得这个选项的吸引力大大降低。


Yev*_*ago 5

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

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
Run Code Online (Sandbox Code Playgroud)

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


Fet*_*che 5

对于由于构建服务器出现问题而到达此处的用户,您可以创建一个运行 exec 命令的 MSBuild 目标来运行nuget 恢复命令,如下所示(在本例中 nuget.exe 位于 .nuget 文件夹中,而不是路径),然后可以在构建解决方案之前立即在 TeamCity 构建步骤中运行

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Run Code Online (Sandbox Code Playgroud)


Nih*_*lic 5

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

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

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

我刚刚用过

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

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

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

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

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

为此,非常感谢Rodolpho Brock

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