我如何让NuGet安装/更新packages.config中的所有软件包?
我有一个在其中的多个项目的解决scheme。 大多数第三方引用都缺失,但每个项目都有packages.config
文件。 我如何获得NuGet安装/更新所需的所有软件包? 这是否需要通过命令行完成每个项目?
您可以使用nuget.exe来恢复您的软件包,或使用NuGet 2.7或更高版本安装,您可以简单地在Visual Studio中编译您的解决scheme,这也将恢复丢失的软件包。
对于NuGet.exe,您可以为每个项目运行以下命令。
nuget install packages.config
或者使用NuGet 2.7,您可以使用命令行恢复解决scheme中的所有软件包 。
nuget restore YourSolution.sln
这两个将拉下包裹。 运行此命令时,您的项目文件不会被修改,所以项目应该已经有了对NuGet包的引用。 如果不是这种情况,则可以使用Visual Studio来安装软件包。
使用NuGet 2.7及更高版本,Visual Studio将在您构build解决scheme时自动恢复丢失的NuGet包,因此不需要使用NuGet.exe。
要更新解决scheme中的所有软件包,首先恢复它们,然后可以使用NuGet.exe来更新软件包,或者从Visual Studio中您可以从软件包pipe理器控制台窗口更新软件包,或者最后您可以使用“pipe理包对话框。
从命令行,您可以将解决scheme中的软件包更新到nuget.org提供的最新版本。
nuget update YourSolution.sln
请注意,这不会在任何NuGet包中运行任何PowerShell脚本。
在Visual Studio中,您可以使用软件包pipe理器控制台来更新软件包。 这有一个好处,任何PowerShell脚本将作为更新的一部分运行,因为使用NuGet.exe将不会运行它们。 以下命令会将每个项目中的所有软件包更新到nuget.org提供的最新版本。
Update-Package
您也可以将其限制为一个项目。
Update-Package -Project YourProjectName
如果要将软件包重新安装到与以前安装的版本相同的版本,则可以使用Update-Package
命令使用-reinstall
参数。
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
信息
重新安装当前解决scheme的所有项目中的所有包:
Update-Package -Reinstall
重新安装当前解决scheme的SPECIFIC PROJECT中的所有软件包( 感谢unarity和ashes999 ):
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
还有另外一种更新,更快捷的方式,可以在Visual Studio中执行此操作。 大卫·艾博(David Ebbo)看看这篇文章 ,如果遇到麻烦,请参阅评论部分。 基本上,你在包pipe理器提示符下执行以下操作:
PM> Install-Package NuGetPowerTools PM> Enable-PackageRestore
之后,当你build立你的解决scheme时,软件包会自动安装,如果他们错过了。
更新:
这个function是通过Visual Studio集成到Nuget 1.6中的 ,所以你甚至不需要安装NuGetPowerTools或者input命令。 所有你需要做的是
右键单击Solution Explorer中的Solution节点,然后selectEnable NuGet Package Restore。
阅读这篇文章的更多细节。
如果您正在使用网站项目,或者不想启用NuGet包恢复,那么这里有另一个解决scheme。
您可以使用软件包pipe理器控制台来枚举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) }
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
这是我find的最好也是最简单的例子。 它将重新安装在packages.config中列出的所有工具,它将保留当前版本。 用项目名称replaceYourProjectNameGoesHere
。
使用最新的NuGet 2.5版本,软件包pipe理器中现在有一个“全部更新”button: http : //docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once
我正在使用visual studio 2015,上面给出的解决scheme不适合我,所以我做了以下几点:
从解决scheme中删除软件包文件夹,并从解决scheme中的每个项目中删除bin和obj文件夹,并为其重build。
也许你会有下一个错误:
无法findnuget.exe
要解决这个问题:在NuGet.targets文件中改变这一行,并将其设置为true:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
参考: https : //stackoverflow.com/a/30918648和https://stackoverflow.com/a/20502049
我相信你需要做的第一件事是启用程序包恢复function 。 另见这里 。 这是在解决scheme(不是项目)级别完成的。
但是,这不会让你一路发生 – 启用恢复function后,我遇到了类似的问题。 (VS2013,NuGet 2.8。)
事实certificate,当我提交项目时,我(无意中)将包提交给源代码控制, 但 Visual Studio(和源代码pipe理插件)在执行签入时已经有助于忽略二进制文件。
当我创build一个发布分支时出现问题。 我的本地副本dev / main / trunk分支有二进制文件,因为这是我最初安装/下载软件包的地方。
不过,在新版本分支中,
- 包文件夹和
.nupkg
文件都在那里 – 所以NuGet不认为有什么要恢复; - 但与此同时,没有任何DLL存在 – 即第三方引用丢失 – 所以我不能build立。
我删除了$(SolutionDir)/packages
(发布分支下$(SolutionDir)/packages
所有包文件夹,然后运行完整的重build,这次构build成功。
…然后当然我回去,并从源代码pipe理中删除包文件夹(在中继和发行分支)。 我还不清楚是否也应删除repositories.config
文件。
项目模板为您安装的许多组件 – 至less在Web项目中 – 都是NuGet包。 也就是说,这个问题不仅限于你添加的软件包。
因此,在创build项目/解决scheme后立即启用软件包恢复,在执行初始签入之前,清除packages
文件夹(并确保将.nuget
文件夹提交到源代码pipe理)。
免责声明:我在这里看到另一个答案,这表明清除packages
文件夹是决议的一部分。 这使我走上正轨,所以我想给作者信用,但我不能再find这个问题/答案。 如果我偶然发现,我会发布一个修改。
我还会注意到Update-Package -reinstall
会修改.sln
和.csproj
/ .vbproj
文件。 至less这就是我的情况。 哪个恕我直言,使这个选项更不具吸引力。
如果您安装了Nuget 2.8,请选中checkbox
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
在Visual Studio中。 如果检查,那么只需重build项目将恢复所有的参考库。
现在,Visual Studio 2012中的Nuget包pipe理器控制台会立即为您提供“还原”button,只要它find任何未安装的包,但是在package.config中。 真棒特征!
在VS2012 V11中,如果在行末使用“-Reinstall”,则不起作用。
所以我简单地使用:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
我知道这是一个旧post,但认为这可能是有用的。 如果您需要在更新过程中忽略特定的软件包(如更新JavaScript引用的任何软件包),请使用以下PowerShell脚本(确保软件包源代码在软件包pipe理器控制台中设置为“全部”):
编辑2014-09-25 10:55 EST – 修正了脚本中的一个错误
$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) }
对于那些由于构build服务器而造成这种情况的人,可以创build一个运行exec命令的MSBuild目标来运行nuget restore命令,如下所示(在这种情况下,nuget.exe位于.nuget文件夹中,而不是该path),然后可以在构build解决scheme之前立即在TeamCity构build步骤中运行
<Target Name="BeforeBuild"> <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/> </Target>
经过3个小时的search和调查。
我有问题,因为我们在团队中有两个成员(使用GitHub源代码pipe理),因为我们没有限制用于发送到远程存储库的包的文件,团队成员之一是发送包到服务器,我已经把这些变化我的本地。
之后,我有PO相同的问题,我也无法发布我的API项目到服务器。
在和我刚刚使用
更新包 – 重新安装 – 在包pipe理器控制台上运行此命令
此命令将重新安装您在解决scheme中使用的所有软件包。 (对于每个项目)
重新安装当前解决scheme的所有项目中的所有包:
Update-Package -ProjectName'NameOfProject'-Reinstall – 在软件包pipe理器控制台上运行此命令
该命令将重新安装与“-ProjectName”之后指定的项目相关的所有软件包。 而且我认为这样更好,因为我等了半个小时才将所有软件包重新安装到解决scheme中。
感谢Rodolpho Brock 。
此外,我会build议你,当你从远程服务器拉改变,按“恢复包”button,将由Visual Studio显示。
- 获取“项目”nugetconfiguration是无效的错误
- NuGet包还原不起作用
- 使用nuget下载旧版本的软件包
- 当一些项目包含在多个解决scheme中时,为所有解决scheme设置一个通用的nuget包文件夹
- 卡住不活动的msbuild.exe进程,lockingStylecop.dll,Nuget AccessViolationException和CIbuild立相互冲突的奥秘
- System.Net.Http vs Microsoft.Net.Http
- 我在哪里可以find一个NuGet包升级到System.Web.Http v5.0.0.0?
- 如何在软件包pipe理器控制台中将“更新软件包”更新为旧版本?
- 是否有可能改变NuGet包的位置?