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


当前回答

在Visual Studio 2017中-当你使用IDE编译时-它会下载所有缺少的nuget包并保存在文件夹“packages”中。

但是在构建机器上编译是使用msbuild.exe完成的。在这种情况下,我下载了nuget.exe。

在执行msbuild.exe之前的每个构建过程中。它将执行-> nuget.exe restore NAME_OF_SLN_File(如果只有一个. sln文件,则可以忽略该参数)。

其他回答

我尝试了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 工作得很好。

在Visual Studio 2017中-当你使用IDE编译时-它会下载所有缺少的nuget包并保存在文件夹“packages”中。

但是在构建机器上编译是使用msbuild.exe完成的。在这种情况下,我下载了nuget.exe。

在执行msbuild.exe之前的每个构建过程中。它将执行-> nuget.exe restore NAME_OF_SLN_File(如果只有一个. sln文件,则可以忽略该参数)。

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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

对于那些因为构建服务器遇到这个问题而到达这里的人,您可以创建一个MSBuild目标,运行exec命令来运行nuget恢复命令,如下所示(在这种情况下,nuget.exe在.nuget文件夹中,而不是在路径上),然后可以在构建解决方案之前立即在TeamCity构建步骤中运行

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

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

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

更新:

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

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

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