我有一个包含多个项目的解决方案。大多数第三方引用都丢失了,但每个项目都有 packages.config
文件。 如何让 NuGet 安装/更新所需的所有包?这需要通过命令行为每个项目完成吗?
您可以使用 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 的信息
打开包管理器控制台
查看 -> 其他窗口 -> 包管理器控制台
重新安装当前解决方案的 ALL PROJECTS 中的所有包:
Update-Package -Reinstall
重新安装当前解决方案的 SPECIFIC PROJECT 中的所有软件包(感谢 unarity 和 ashes999):
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Update-Package : Already referencing a newer version of 'Newtonsoft.Json'
。我选择恢复我的 packages.config 文件并尝试在构建时重新安装
在 Visual Studio 中还有另一种更新更快的方法来执行此操作。查看 David Ebbo 的 this post,如果您遇到问题,请参考评论部分。基本上,您在包管理器提示符下执行以下操作:
PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore
之后,当您构建解决方案时,如果缺少软件包,将自动安装它们。
更新:
此功能内置于带有 Visual Studio 集成的 Nuget 1.6,因此您甚至无需安装 NuGetPowerTools 或键入命令。你所要做的就是
右键单击解决方案资源管理器中的解决方案节点,然后选择启用 NuGet 包还原。
阅读this article了解更多详情。
如果您正在使用网站项目,或者不想启用 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) }
Update-Package -Reinstall
。
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
这是我发现的最好和最简单的例子。它将重新安装 packages.config 中列出的所有 nuget,并将保留当前版本。将 YourProjectNameGoesHere
替换为项目名称。
在最新的 NuGet 2.5 版本中,包管理器中现在有一个“全部更新”按钮:http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once
我正在使用visual studio 2015,上面给出的解决方案对我不起作用,所以我做了以下事情:
从我的解决方案中删除 packages 文件夹,并从解决方案中的每个项目中删除 bin 和 obj 文件夹并重新构建。
也许你会遇到下一个错误:
无法找到 nuget.exe
要解决这个问题:在 NuGet.targets 文件中更改此行并将其设置为 true:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
参考:https://stackoverflow.com/a/30918648 和 https://stackoverflow.com/a/20502049
经过3个小时的搜索和调查。
我遇到了问题,因为我们团队中有两名成员(使用 GitHub 源代码控制),因为我们没有限制要发送到远程存储库的包文件,其中一名团队成员将包发送到服务器,我已将更改拉到我的本地人。
之后我遇到了与 PO 相同的问题,我也无法将我的 API 项目发布到服务器。
在和我刚刚使用
Update-Package -Reinstall - 在包管理器控制台上运行此命令
此命令将重新安装您在解决方案中使用的所有软件包。 (对于每个项目)
重新安装当前解决方案的 ALL PROJECTS 中的所有包:
Update-Package -ProjectName 'NameOfProject' -Reinstall - 在包管理器控制台上运行此命令
此命令将重新安装与您在“-ProjectName”之后指定的项目相关的所有软件包。而且我认为这更好,因为我等了半个小时才重新安装解决方案中的所有软件包。
非常感谢Rodolpho Brock。
另外,我建议您在从远程服务器中提取更改时,按下 Visual Studio 将显示的“恢复包”按钮。
我相信您需要做的第一件事是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
文件。至少在我的情况下是这样的。恕我直言,这个选项的吸引力大大降低。
对于那些由于构建服务器遇到此问题而到达这里的人,您可以创建一个运行 exec 命令的 MSBuild 目标来运行 nuget restore 命令,如下所示(在这种情况下,nuget.exe 在 .nuget 文件夹中,而不是在路径),然后可以在构建解决方案之前立即在 TeamCity 构建步骤中运行
<Target Name="BeforeBuild">
<Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
如果您安装 Nuget 2.8,请选中复选框
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
在 Visual Studio 中。如果选中,则只需重建项目即可恢复所有参考库。
Allow NuGet to download missing packages
复选框。
我尝试了 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
效果很好。
现在 Visual Studio 2012 中的 Nuget 包管理器控制台会在找到任何未安装但在 package.config 中的包时自动为您提供“恢复”按钮。很棒的功能!
在 VS2012 V11 中,如果我在行尾使用“-Reinstall”,它就不起作用。
所以我简单地使用了:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
我知道这是一篇旧帖子,但认为这可能很有用。如果您需要在更新过程中忽略特定包(如任何更新 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) }
不知道从什么时候开始,但是在 VS2019 中你可以用更简单的方式做到这一点:
在解决方案资源管理器中右键单击解决方案选择管理 Nuget 包解决方案有 4 个选项卡,浏览、安装、更新、合并合并显示是否有任何项目使用不同版本的包(在大多数情况下,这就是为什么我们要更新所有包)更新显示任何项目中是否有可用的更新。全选并点击更新,工作就完成了。
在 Visual Studio 2017 中 - 当您使用 IDE 编译时 - 它将下载所有缺少的 nuget 包并保存在“包”文件夹中。
但是在构建机器上编译是使用 msbuild.exe 完成的。在那种情况下,我下载了 nuget.exe。
在执行 msbuild.exe 之前的每个构建过程中。它将执行 -> nuget.exe restore NAME_OF_SLN_File (如果只有一个 .SLN 文件,则可以忽略该参数)。
MSbuild -t:restore Xxxx.sln
Update-Package -reinstall -Project ProjectName