ChatGPT解决这个技术问题 Extra ChatGPT

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

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

请考虑更改已接受的答案,因为 NuGet 现在更多地集成到 Visual Studio 中,并且有更简单的方法来解决此问题。
在最新的 NuGet 2.5 版本中,包管理器中现在有一个“全部更新”按钮:docs.nuget.org/docs/release-notes/…
@ErikSchierboom 谢谢!这个线程应该更新,因为它现在可用
相关项目:chocolatey.org
为了搜索者的利益,在 VS2013 中,您可以右键单击解决方案并选择“启用 NuGet 包还原”。然后构建。

N
Nick Cox

您可以使用 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 中,您可以从包管理器控制台窗口更新包,或者最后您可以使用管理包对话框。

从命令行,您可以将解决方案中的包更新到 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 的信息


Visual Studio 中是否有一些简单的命令可以执行此操作?我为解决方案启用了自动恢复,但由于缺少引用(尚未从 packages.config 恢复包),“构建”仍然给我很多错误。
如果不安装 NuGet Power Tools - github.com/davidfowl/NuGetPowerTools 之类的东西,我不这么认为。但是,这与您已经拥有的自动恢复功能基本相同。
这也适用于一般安装包,而不仅仅是“恢复”它们(没有很大的技术差异,因为恢复 IS 安装;但它不限于想要使用解决方案包恢复功能的人)。但是,您确实需要为此目的设置环境变量 EnableNuGetPackageRestore。我在调用“nuget install packages.config”之前在我的psake脚本中设置了它,如下所示:$env:EnableNuGetPackageRestore =“true”。这会为 PS 进程及其产生的进程设置 var,而不会影响机器范围的变量(以及可能的其他构建)。
恢复与安装并不完全相同。从命令行安装包不会更改您的项目,因此不会添加诸如程序集引用之类的内容。
我必须花费至少一个小时来寻找解决方案,最后确实是Update-Package -reinstall -Project ProjectName
B
Brian Webster

打开包管理器控制台

查看 -> 其他窗口 -> 包管理器控制台

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

Update-Package -Reinstall

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

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

如果您刚刚更改了目标框架或类似框架,这也是一个完美的选择。我面临着不得不更新 25 个奇怪的项目的前景,其中散布着大量的 nuget 包,而第一个命令非常适合我想要的。甚至在矫枉过正的意义上也没有核武器。
请注意,这将卸载并重新安装所有内容——因此您的所有项目和配置文件都会更改。 (我正在运行 NuGet 2.8。)
您甚至可能想要添加 -IgnoreDependencies 开关。我有一个更新包失败,因为我使用的一个包的依赖项存在于比我的 packages.config 中指定的新版本中
@Mathias 有一个很好的观点。我使用了这个命令,结果出现这个消息后,任何项目中都没有包:Update-Package : Already referencing a newer version of 'Newtonsoft.Json'。我选择恢复我的 packages.config 文件并尝试在构建时重新安装
我遇到的一个问题是它删除了我的 packages.config 并且没有恢复它 - 为了解决它,我将 packages.config 内容复制到记事本文件中,撤消(在 TFS 中)对 packages.config 的删除并用新的覆盖数据。可能是 VS 中的某些设置导致了这种情况,但我找不到它。
A
Alex

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

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

更新:

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

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

阅读this article了解更多详情。


此处更新的答案将是大多数人的最佳解决方案,因为他们没有 nuget.exe(但会将 nuget 安装到 Visual Studio 中)。
但是包还原实际上会为您下载 nuget.exe
我只是这样做了。它仍然无法构建,说缺少引用。 Build说所有的包都已经安装了。我去解决方案/包文件夹删除了有问题的包,它下载了它们并开始工作。
@Shy 这种方式现在已被弃用,取而代之的是不修改所有项目文件的解决方案。
D
David Martin

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

我尝试了上面的每个答案,但无法让他们在我的一个解决方案中工作。但是这个的一个变种做到了。 $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
如果您在同一个 csproj 上使用多个解决方案,则 nuget 包还原是一场噩梦......我为这个答案喝彩!
这并没有解决我的问题,但它确实让我感觉好多了!
这非常棒,并且提供了一种将包迁移到新项目的方法: [xml]$packages = gc c:\PathToExisting\packages.config #followed by # install each package $packages.packages.package | % { 安装包 -id $($_.id) -Version $($_.version) }
@PerryJ 您可以输入 Update-Package -Reinstall
a
ashes999
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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


我遇到了一些问题,因为我的 packages.config 包含对两个具有特定版本的包的引用,但一个包依赖于另一个没有特定版本的包。当我运行更新时,它首先卸载了所有软件包,然后重新安装失败,因为较新版本的依赖项“已被引用”。虽然删除工作正常,所以现在我的 packages.config 是空的。在尝试完全更新之前,我必须从源代码管理中恢复 packages.config 并更新有冲突的包...
E
Erik Schierboom

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


此外,您可以从包管理器控制台运行“更新包”来执行项目中的所有包:nuget.codeplex.com/wikipage?title=Updating%20All%20Packages
C
Community

我正在使用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


N
Nihad Delic

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

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

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

在和我刚刚使用

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

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

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

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

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

非常感谢Rodolpho Brock

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


D
David

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

但这不会让你一路走好——我在启用恢复功能后遇到了类似的问题。 (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 文件。至少在我的情况下是这样的。恕我直言,这个选项的吸引力大大降低。


正如您所说,我遇到了完全相同的问题并且花了很长时间升级和重新安装软件包,而您所说的只是删除本地软件包。
F
Fetchez la vache

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

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

R
RBT

如果您安装 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 复选框。
S
Sergei Zinovyev

我尝试了 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 : Unable to find package 'EntityFramework.BulkInsert-ef6'。在执行安装或更新之前,必须恢复现有包。 手动运行 Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 效果很好。


我也高兴的哭了!是的!!多么节省时间。仅供参考,如果您使用这一行而不是 Sergei 脚本中的最后一行,它将不会安装依赖项。直接重新安装:$projectPackages | foreach { 更新包 -IgnoreDependencies -重新安装 -ProjectName $_[0] -Id $_[1] }
S
Sunny Sharma

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


这对于 Visual Studio 2010 也是如此
p
p.s.w.g

在 VS2012 V11 中,如果我在行尾使用“-Reinstall”,它就不起作用。

所以我简单地使用了:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

J
Joe the Coder

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

编辑 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) }

c
cheny

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

在解决方案资源管理器中右键单击解决方案选择管理 Nuget 包解决方案有 4 个选项卡,浏览、安装、更新、合并合并显示是否有任何项目使用不同版本的包(在大多数情况下,这就是为什么我们要更新所有包)更新显示任何项目中是否有可用的更新。全选并点击更新,工作就完成了。


D
David

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

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

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


我发现您可以在命令行的 SLN 上使用 MSBuild -t:restore 来执行此操作。 MSbuild -t:restore Xxxx.sln