187

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

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

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

进入 NuGet 包管理器时,界面仍然在这些包旁边报告一个勾号,表示它们已安装。

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

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

4

13 回答 13

337

尝试重新安装软件包

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

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

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

于 2013-03-08T22:57:00.467 回答
45

您需要在 VS 解决方案级别启用 NuGet 包还原,才能使还原丢失的包正常工作。

在此处输入图像描述

于 2012-11-06T09:56:43.280 回答
13

如果这对我有帮助,以上都不够。我仍然无法构建,VS 仍然找不到参考。关键是在恢复包后关闭并重新打开解决方案。

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

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

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

但无论采用何种方法,这些引用仍将显示为缺失。当你构建它时,它会失败。叹。但是,如果您关闭解决方案并重新打开它,现在 VS 会<HintPath>再次检查那些 nice s,发现这些包回到了它们所属的位置,并且一切都很好。

更新

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

于 2013-11-22T01:08:15.687 回答
11

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

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

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

归功于Dan Haywood他的博客文章

于 2013-09-16T06:00:22.303 回答
8

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

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 工具来挑选和选择项目中要保留和忽略的更改。

于 2013-01-22T20:39:20.780 回答
4

此脚本将重新安装项目的所有包,而不会弄乱依赖项或安装可能已被有意删除的依赖项。(为他们的零件包开发人员提供更多信息。)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies
于 2016-06-02T17:28:47.187 回答
3

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

于 2013-05-13T15:32:19.310 回答
2

在 Visual Studio 2015 中(Soulution 受源代码控制,MVC 项目),csanoUpdate-Package -Reinstall -ProjectName Your.Project.Name工作,但它搞砸了一些写锁。

我之前必须手动删除“包”文件夹。(它似乎因为源代码控制而被锁定)。

此外,我必须从 NuGet 包管理器重新安装 MVC 包。

于 2015-11-17T10:32:44.737 回答
1

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

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

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

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

于 2015-07-01T10:00:45.797 回答
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
        }
    }
}
于 2016-09-17T03:24:34.697 回答
1

我有同样的问题,缺少参考资料。在我的场景下面:

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

项目和包中的所有版本号都匹配,进行 nuget 还原(以所有方式)不起作用。

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

于 2017-01-06T13:46:41.543 回答
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
    }
    
于 2013-12-08T23:40:04.163 回答
0

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

我刚刚清除了缓存并重建,它工作。(Tools-Option-Nuget Package Manager - General)

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

于 2015-05-17T19:59:02.340 回答