恢复Nuget参考?

时间:2012-10-26 10:49:14

标签: visual-studio-2012 nuget

我有解决方案& Visual Studio 2012中的项目。

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

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

进入NuGet包管理器时,界面仍在报告这些包旁边的刻度,表示它们已安装。

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

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

13 个答案:

答案 0 :(得分:325)

Try re-installing the packages

在NuGet包管理器控制台中输入以下命令:

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

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

答案 1 :(得分:44)

您需要Enable NuGet package restore at the VS solution level才能恢复缺失的包。

enter image description here

答案 2 :(得分:13)

如果这对某人有帮助,对我来说,上述情况都不够。我仍然无法建立,VS仍然找不到参考。关键是在恢复软件包后关闭并重新打开解决方案

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

您打开缺少包的解决方案。参考文献显示VS无法找到它们。有many ways来恢复丢失的包,包括

  • 构建设置为自动恢复的解决方案
  • 打开软件包管理器控制台并单击漂亮的“恢复”按钮
  • 如果安装了命令行nuget,则执行nuget restore

但无论采用何种方法,这些参考文献仍将显示为缺失。当你构建它将失败。叹。但是,如果您关闭解决方案并重新打开它,现在VS再次检查那些不错的<HintPath>,发现这些包已经回到它们所属的位置,并且一切都与世界相符。

更新

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

答案 3 :(得分:9)

虽然@jmfenoll提供的解决方案有效,但它会更新到最新的软件包。在我的情况下,安装了beta2(预发行版),它将所有的库更新为RC1(有一个bug)。因此,上述解决方案只完成了一半的工作。

如果您遇到与我相同的情况,并希望将项目与您在packages.config中已经/或指定的NuGet软件包的确切版本同步,那么此脚本可能对您有所帮助。只需将其复制并粘贴到您的软件包管理器控制台

即可
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
    }
  }
}

然后使用像

这样的特殊包名执行它
Sync-References AutoMapper

或所有包裹,如

Sync-References

致信 Dan Haywood his blog post

答案 4 :(得分:8)

可以在Package Manger Console窗口中运行以下脚本,并在重新安装之前从解决方案中的每个项目中删除所有包。

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

这将再次运行每个包的安装脚本,这将恢复缺少的程序集引用。不幸的是,所有安装脚本的其他东西都可以 - 比如创建文件和修改配置 - 也会再次发生。您可能希望从一个干净的工作副本开始,并使用您的SCM工具来选择要保留的项目中的哪些更改以及要忽略哪些更改。

答案 5 :(得分:3)

我手动添加了DLL。右键单击项目中的References,选择Add Reference,然后在对话框中按下Browse按钮。 NuGet DLL位于解决方案的packages目录中。要获取它们的名称,您可以右键单击另一个正常工作的项目中的引用,然后选择属性并查看路径属性。

答案 6 :(得分:2)

在Visual Studio 2015中(Soulution受源代码控制,MVC-Project),csano&#39; s Update-Package -Reinstall -ProjectName Your.Project.Name工作,但它搞砸了一些写锁。

之前我必须手动删除&#34;包&#34; -Folder。 (由于源代码控制,它似乎被锁定了。)

另外,我不得不从NuGet包管理器重新安装MVC-Package。

答案 7 :(得分:2)

此脚本将重新安装项目的所有包,而不会破坏依赖项或安装可能已被删除的依赖项。 (更多的是他们的部分包开发人员。)

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

答案 8 :(得分:1)

以防它有助于某人 - 在我的场景中,我有一些共享库(它们有自己的TFS项目/解决方案)全部合并为一个解决方案。

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

潜在的问题是,虽然您的解决方案有自己的包文件夹并且已将它们正确地恢复到该文件夹​​,但项目文件(例如.csproj)正在引用可能没有下载包的其他项目。在文本编辑器中打开文件以查看引用的来源。

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

答案 9 :(得分:1)

我必须同意@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
        }
    }
}

答案 10 :(得分:1)

我遇到了缺少引用的相同问题。在我的场景下面:

  • Fresh Windows 10计算机和VS Community 2015安装
  • 刚刚通过TFS检查了存储库代码
  • 一个解决方案构建得很好,一个解决方案有一个项目缺少引用(EF,System.Http,作为实例),但相关的nuget包已正确安装。

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

我是如何解决的:只需删除解决方案根目录中的包文件夹并执行nuget restore。此时dll已正确下载,可以为缺少的引用添加。

答案 11 :(得分:0)

  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. 清除项目根目录中的packages文件夹

  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
    }
    

答案 12 :(得分:0)

我经常遇到这个问题,在我的情况下,检查了下载丢失的NuGet(但它没有恢复它们),我无法卸载&amp;重新安装,因为我修改了一些已安装的软件包......所以:

我刚刚清除了缓存和重建,但它确实有效。 (工具 - 选项 - Nuget包管理器 - 常规)

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