我有一个包含多个项目的解决方案。大多数第三方引用都缺失,但每个项目都有packages.config文件。如何让NuGet安装/更新所需的所有软件包?每个项目都需要通过命令行完成吗?
packages.config
您可以使用nuget.exe恢复您的包,或者安装NuGet 2.7或更高版本,您可以简单地在Visual Studio中编译您的解决方案,这也将恢复丢失的包。
NuGet.exe您可以为每个项目运行以下命令。
nuget install packages.config
或者使用NuGet 2.7您可以恢复解决方案中的所有软件包命令行。
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中,您可以使用包管理器控制台来更新包。这样做的好处是,任何PowerShell脚本都将作为更新的一部分运行,而使用NuGet.exe不会运行它们。以下命令将把每个项目中的所有包更新到nuget.org.
Update-Package
您也可以将其限制为一个项目。
Update-Package -Project YourProjectName
如果您想将软件包重新安装到与之前安装的版本相同的版本,那么您可以使用-reinstall参数和Update-Package命令。
-reinstall
Update-Package -reinstall
Update-Package -reinstall -Project YourProjectName
-reinstall选项将首先卸载,然后再次将包安装回项目中。
或者,您可以使用Manage Packages对话框更新包。
Manage Packages
更新内容:
在Visual Studio中还有另一种更新更快的方法来执行此操作。查看David Ebbo的这篇文章,如果遇到麻烦,请参考注释部分。基本上,您可以在包管理器提示符中执行以下操作:
PM> Install-Package NuGetPowerTools PM> Enable-PackageRestore
之后,当您构建解决方案时,如果缺少软件包,则会自动安装它们。
更新时间:
此功能内置于Nuget 1.6中,并与Visual Studio集成,因此您甚至不需要安装NuGetPowerTools或键入命令。您所要做的就是
右键单击解决方案资源管理器中的解决方案节点并选择 启用NuGet包还原。
阅读这篇文章了解更多详情。
如果您使用的是网站项目,或者不想启用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) }
随着最新的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 -Reinstall
重新安装当前解决方案(多亏了单性和ashes999)的特定项目中的所有软件包:
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
这是我找到的最好和最简单的示例。它将重新安装packages.config中列出的所有nuget,并保留当前版本。将YourProjectNameGoesHere替换为项目名称。
YourProjectNameGoesHere
现在,Visual Studio 2012中的Nuget包管理器控制台会自动为您提供“恢复”按钮,只要它找到任何未安装的包,但在package.config. 很棒的功能!
我相信您需要做的第一件事是启用包恢复功能。另请参阅这里。这是在解决方案(而不是项目)级别完成的。
但这不会让你一路走-我在启用恢复功能后遇到了类似的问题。(VS2013,NuGet 2.8。)
事实证明,我在提交项目时(无意中)将包提交给了源代码控制——但 Visual Studio(和源代码控制插件)在执行签入时帮助忽略了二进制文件。
当我创建发布分支时出现了问题。我的dev/main/干分支的本地副本有二进制文件,因为那是我最初安装/下载软件包的地方。 但是,在新的发布分支中,
.nupkg
我删除了$(SolutionDir)/packages(发布分支下)中的所有包文件夹,然后运行完整的重建,这次构建成功了。 …然后当然我回去从源代码控制中删除了包文件夹(在主干和发布分支中)。我不清楚(还)是否应该删除repositories.config文件。
$(SolutionDir)/packages
repositories.config
项目模板为您安装的许多组件-至少对于Web项目-都是NuGet包。也就是说,此问题不仅限于您添加的包。 因此,在创建项目/解决方案后立即启用包恢复,并且在执行初始签入之前,请清除packages文件夹(并确保将.nuget文件夹提交给源代码管理)。
packages
.nuget
免责声明:我在SO上看到了另一个答案,它表明清除packages文件夹是解决方案的一部分。这让我走上了正确的轨道,所以我想给作者荣誉,但是我再也找不到那个问题/答案了。如果我偶然发现它,我会发布一个编辑。
我还注意到Update-Package -reinstall将修改.sln和.csproj/.vbproj文件。至少在我的情况下是这样做的。在我看来,这使得这个选项不那么有吸引力。
.sln
.csproj
.vbproj
在VS2012 V11中,如果我在行的末尾使用“-Reinstall”,它将不起作用。
所以我简单地使用:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
我知道这是一篇旧文章,但认为这可能有用。如果您需要在更新过程中忽略特定的包(如任何更新JavaScript引用的包),请使用以下PowerShell脚本(确保您的包源在包管理器控制台中设置为“全部”):
编辑2014-09-25 10:55 AM EST-修复了脚本中的bug
$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) }
如果您安装Nuget 2.8,请选中复选框
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
在Visual Studio中。如果选中,则只需重建项目即可恢复所有参考库。
我正在使用Visual Studio 2015,上面给出的解决方案对我不起作用,所以我做了以下操作:
从我的解决方案中删除包文件夹以及解决方案中每个项目的bin和obj文件夹,并对其进行重建。
你可能会遇到下一个错误:
无法定位nuget.exe
要解决这个问题:更改NuGet.targets文件中的这一行并将其设置为true:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
参考:https://stackoverflow.com/a/30918648和https://stackoverflow.com/a/20502049
对于那些由于构建服务器因此而到达这里的人,您可以创建一个MSBuild目标,运行exec命令来运行Nuget恢复命令,如下所示(在这种情况下nuget.exe在. nuget文件夹中,而不是在路径上),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行
<Target Name="BeforeBuild"> <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/> </Target>
经过三个小时的搜索和调查。
我遇到了问题,因为我们团队中有两个成员(使用GitHub源代码控制),因为我们没有限制发送到远程存储库的包的文件,其中一个团队成员将包发送到服务器,我已经将更改拉到我的本地。
之后,我遇到了与PO相同的问题,也无法将我的API项目发布到服务器。
在和我刚刚使用
更新包-重新安装-在包管理器控制台上运行此命令
此命令将重新安装您在解决方案中使用的所有包。(对于每个项目)
更新包-项目名称'NameOfProject'-重新安装-在包管理器控制台上运行此命令
此命令将重新安装与您在“-ProjectName”之后指定的项目相关的所有软件包。我认为这更好,因为我已经等待了半个小时才能在解决方案中重新安装所有软件包。
非常感谢Rodolpho Brock。
此外,我建议您,当您从远程服务器拉取更改时,按Visual Studio将显示的“还原包”按钮。
在Visual Studio 2017中-当您使用IDE编译时-它将下载所有丢失的nuget包并保存在文件夹“包”中。
但是在构建机器上编译是使用msbuild.exe.在这种情况下,我下载了nuget.exe.
在执行之前的每个构建过程中msbuild.exe.它将执行->nuget.exe恢复NAME_OF_SLN_File(如果只有一个. SLN文件,则可以忽略该参数)。
我尝试了Update-Package -reinstall,但它在一个包上失败,并停止处理我的解决方案中所有剩余的项目包。
我最终使用了枚举所有package.config文件并为每个项目/包运行Update-Package -Reinstall -ProjectName prj -Id pkg的脚本。
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 效果很好
Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6
不知道从什么时候开始,但在VS2019中,你可以用更简单的方式做到这一点: