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


当前回答

我尝试了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包管理器控制台在Visual Studio 2012给你一个“恢复”按钮,一旦它发现任何包没有安装,但在Package .config。 很棒的功能!

打开包管理器控制台

视图->其他Windows -> Package Manager Console

重新安装当前解决方案all PROJECTS中的所有包:

Update-Package -Reinstall

重新安装当前解决方案的SPECIFIC PROJECT中的所有包(感谢unarity和ashes999):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

这是我找到的最好最简单的例子。它将重新安装在包中列出的所有块。配置,它将保留当前版本。用项目名称替换YourProjectNameGoesHere。

我知道这是一个老帖子,但我认为这可能有用。如果您需要在更新过程中忽略特定的包(如任何更新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) }

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

但这并不能解决所有问题——在启用恢复功能后,我遇到了类似的问题。(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文件。至少对我来说是这样的。恕我直言,这使得这个选择不那么有吸引力。