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


当前回答

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

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

其他回答

我尝试了Update-Package -重新安装,但它在一个包上失败,并停止处理解决方案中所有剩余的项目包。

我最终创建了枚举所有包的脚本。对每个项目/包执行Update-Package -重新安装-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'包。在执行安装或更新之前,必须还原现有包。 手动运行 更新-包-重新安装-ProjectName my_prj -Id EntityFramework。BulkInsert-ef6 工作得很好。

这里有另一个解决方案,如果你正在使用网站项目,或不想启用NuGet包恢复。

您可以使用包管理器控制台来枚举包中的所有包。配置文件并重新安装。

# 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) }

我认为您需要做的第一件事是启用包恢复特性。也可以在这里看到。这是在解决方案(而不是项目)级别上完成的。

但这并不能解决所有问题——在启用恢复功能后,我遇到了类似的问题。(VS2013, NuGet 2.8)

事实证明,当我提交项目时,我已经(无意地)将包提交给了源代码控制——但是Visual Studio(和源代码控制插件)在执行签入时忽略了二进制文件。

当我创建一个发布分支时,问题出现了。我在dev/main/trunk分支的本地副本中有二进制文件,因为那是我最初安装/下载包的地方。 然而,在新的发布分支中,

包文件夹和. nuupkg文件都在那里——所以NuGet不认为有任何东西要恢复; 但与此同时,没有一个dll存在——即第三方引用缺失——所以我无法构建。

我删除了$(SolutionDir)/packages中的所有包文件夹(在发布分支下),然后运行完整的重新构建,这一次构建成功了。 ... 当然,然后我回到源代码控制中删除了包文件夹(在主干和发布分支中)。我还不清楚(目前)存储库是否。配置文件也应该被删除。

项目模板为您安装的许多组件(至少对于web项目而言)都是NuGet包。也就是说,这个问题并不局限于您添加的包。 因此,在创建项目/解决方案后立即启用包恢复,在执行初始签入之前,清除packages文件夹(并确保将.nuget文件夹提交给源代码控制)。

免责声明:我在SO上看到了另一个答案,它表明清除packages文件夹是解决方案的一部分。这让我找到了正确的方向,所以我想给作者点赞,但我再也找不到那个问题/答案了。如果我偶然发现了,我会把它编辑一下。

我还要注意Update-Package -重装会修改.sln和.csproj/。vbproj文件。至少对我来说是这样的。恕我直言,这使得这个选择不那么有吸引力。

在Visual Studio中还有另一种更新且更快的方法来实现这一点。看看David Ebbo的这篇文章,如果你遇到麻烦,请参考评论部分。基本上,在包管理器提示符中执行以下操作:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

之后,当您构建解决方案时,如果缺少这些包,将自动安装。

更新:

这个功能是内置在Nuget 1.6的visual studio集成,所以你甚至不需要安装NuGetPowerTools或键入命令。你所要做的就是

在“解决方案资源管理器”中右键单击“解决方案”节点并选择 启用NuGet包恢复。

阅读这篇文章了解更多细节。

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

编辑2014-09-25 10:55 AM 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) }