还原Nuget引用?

我在Visual Studio 2012中有解决scheme和项目。

该项目的根目录中有一个文件packages.config

为了这个问题的目的,我们假设我不小心从我的项目的References部分中删除了这些库。

当进入NuGet软件包pipe理器时,界面仍然报告这些软件包旁边的勾号,表示已经安装。

我可以看到如何解决这种情况的唯一方法是从packages.config删除所有条目,这将解决NuGet接口报告它们安装的问题,并重新添加每个条目。

有更聪明的方法吗? 我曾希望启用“启用nuget恢复丢失的软件包”将解决这个问题,但它似乎没有做任何事情。

尝试重新安装软件包 。

在NuGet包pipe理器控制台中input以下命令:

Update-Package -Reinstall -ProjectName Your.Project.Name

如果要重新安装软件包并为整个解决scheme恢复引用,请省略-ProjectName参数。

您需要在VS解决scheme级别启用NuGet程序包还原,以使还原丢失的程序包正常工作。

在这里输入图像说明

如果这有助于某人,对我而言,上述都不足以解决问题。 我仍然无法build立,VS仍然无法find参考。 关键是在恢复软件包后closures并重新打开解决scheme

这里是场景(使用Visual Studio 2012):

您打开一个缺less包的解决scheme。 参考资料显示VS找不到它们。 有很多方法可以恢复丢失的软件包,包括

  • 构build一个设置为自动恢复的解决scheme
  • 打开软件包pipe理器控制台,然后点击好的“恢复”button
  • 如果您安装了命令行nuget,则执行nuget restore

但是无论采用什么方法,这些参考文献仍然会显示为缺失。 而当你build立它会失败。 叹。 但是,如果closures解决scheme并重新打开它,现在VS再次检查那些不错的<HintPath> ,发现这些软件包已经回到了他们所属的地方,并且一切顺利。

更新

Visual Studio 仍然没有看到你有包? 仍然显示它无法解决的参考? 确保您恢复的软件包版本与.csproj文件中的<HintPath>完全相同。 即使是一个小错误修复号码(例如1.10.1到1.10.2)也会导致失败。 你可以通过直接编辑你的csproj xml来解决这个问题,或者通过删除引用,并且新build一个指向packages目录中新恢复的版本的方法来解决这个问题。

以下脚本可以在“包pipe理器控制台”窗口中运行,并在重新安装之前从您的解决scheme中的每个项目中删除所有包。

 foreach ($project in Get-Project -All) { $packages = Get-Package -ProjectName $project.ProjectName foreach ($package in $packages) { Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName } foreach ($package in $packages) { Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version } } 

这将再次运行每个包的安装脚本,这应该还原缺less的程序集引用。 不幸的是,所有安装脚本的其他东西都可以做 – 比如创build文件和修改configuration – 也会再次发生。 您可能希望从干净的工作副本开始,并使用SCM工具来select要保留的项目中的哪些更改以及要忽略哪些更改。

当@jmfenoll提供的解决scheme工作时,它会更新到最新的软件包。 在我的情况下,安装beta2(预发行)它更新所有库到RC1(有一个bug)。 因此,上述解决scheme只做了一半的工作。

如果你和我的情况一样,而且你希望将你的项目与你在packages.config指定的NuGet包的确切版本进行同步,那么这个脚本可能会帮助你。 只需复制并粘贴到您的软件包pipe理器控制台

 function Sync-References([string]$PackageId) { get-project -all | %{ $proj = $_ ; Write-Host $proj.name; get-package -project $proj.name | ? { $_.id -match $PackageId } | % { Write-Host $_.id; uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ; install-package -projectname $proj.name -id $_.id -version $_.version } } } 

然后用一个像sepific包的名字来执行它

 Sync-References AutoMapper 

或者像所有包一样

 Sync-References 

积分去丹海伍德和他的博客文章 。

我手动添加了DLL。 右键单击项目中的引用,select添加引用,然后在对话框中按下浏览button。 解决scheme的软件包目录中的NuGet DLLs。 要获取它们的名称,您可以右键单击另一个正常工作的项目中的引用,然后select属性并查看path属性。

在Visual Studio 2015中(Soulution是在源代码控制下,MVC-Project),csano的Update-Package -Reinstall -ProjectName Your.Project.Name工作,但它与一些写入locking搞砸了。

我不得不手动删除“包” – 文件夹。 (由于源代码pipe理,它似乎被locking)。

此外,我不得不从NuGet包pipe理器重新安装MVC包。

为了以防万一 – 在我的情况下,我有一些共享库(其中有自己的TFS项目/解决scheme)全部组合成一个解决scheme。

Nuget会成功恢复项目,但DLL将会丢失。

根本的问题是,虽然你的解决scheme有自己的包文件夹,并已正确地恢复到该文件夹​​,项目文件(如.csproj)是引用一个不同的项目,可能没有下载包。 在文本编辑器中打开文件以查看您的引用来自哪里。

在不同的互连共享解决scheme上pipe理软件包时,可能会发生这种情况 – 因为您可能希望确保所有的DLL都在同一级别上,您可以将其设置在顶层。 这意味着它有时候会为引用的DLL寻找完全不同的解决scheme,所以如果你没有下载所有的项目/解决scheme并且是最新的,那么你可能会遇到上述问题。

这个脚本将重新安装一个项目的所有包,而不会搞乱依赖关系或安装可能被删除的依赖关系。 (更多为他们的零件包开发商。)

 Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies 

我不得不同意@Juri:jmfenoll的广受欢迎的回答并不完整。 对于引用错误的情况,我提出大多数情况下,您不想更新到最新的软件包,而只是修复您刚刚使用的当前版本的引用。 Juri提供了一个方便的函数Sync-References来做到这一点。

但是,我们可以进一步,让项目以及包过滤灵活性:

 function Sync-References([string]$PackageId, [string]$ProjectName) { get-project -all | Where-Object { $_.name -match $ProjectName } | ForEach-Object { $proj = $_ ; Write-Output ('Project: ' + $proj.name) Get-Package -project $proj.name | Where-Object { $_.id -match $PackageId } | ForEach-Object { Write-Output ('Package: ' + $_.id) uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force install-package -projectname $proj.name -id $_.id -version $_.version } } } 

我有与缺less参考相同的问题。 在我的情况下:

  • 新的Windows 10机器和VS社区2015安装
  • 刚刚通过TFS签出仓库代码
  • 一个解决scheme构build得很好,一个解决scheme有一个缺less引用的项目(例如EF,System.Http),但是相应的nuget包已经正确安装。

项目和软件包中的所有版本号匹配,执行nuget恢复(以各种方式)都不起作用。

我如何修复它:只需删除解决scheme根目录下的包文件夹并执行nuget恢复即可。 在这一点上,DLL正确下载,并可以添加缺less的参考。

我受到这个问题太多,在我的情况下,下载缺less的NuGet被检查(但它不是恢复它们),我不能卸载和重新安装,因为我修改了一些已安装的软件包…所以:

我刚刚清除caching和重build,它的工作。 (工具选项-Nuget包pipe理器 – 一般)

此链接也有助于https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

  1. 复制项目的packages.config文件并应用所有版本修改
  2. 取消所有包装并取消依赖

     $packages = Get-Package -ProjectName [nameOfProjectToRestore] foreach ($package in $packages) { uninstall-package -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ; } 
  3. 清除项目根目录下的软件包文件夹

  4. 将修改的package.config复制到网站的根文件夹

  5. 运行这个代码来恢复项目

     $packages = Get-Package -ProjectName [nameOfProjectToRestore] foreach ($package in $packages) { uninstall-package -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ; } foreach ($package in $packages) { install-package $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version }