我有一个包含多个项目的解决方案。大多数第三方引用都缺失,但每个项目都有packages.config
个文件。 如何让NuGet安装/更新所需的所有软件包?这是否需要通过命令行为每个项目完成?
答案 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
对话框更新软件包。
<强>更新强>
-reinstall
答案 1 :(得分:493)
重新安装当前解决方案的所有项目中的所有包:
Update-Package -Reinstall
重新安装当前解决方案的SPECIFIC PROJECT中的所有软件包(感谢unarity和ashes999 ):
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.aspx和https://stackoverflow.com/a/30918648
答案 7 :(得分:4)
我遇到了问题,因为我们团队中有两个成员(使用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并不认为有什么可以恢复; 我删除了$(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中,您可以以更简单的方式做到这一点:
答案 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文件,则可以忽略该参数)。