ChatGPT解决这个技术问题 Extra ChatGPT

恢复 Nuget 引用?

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

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

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

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

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

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


ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

Try re-installing the packages

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

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

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


链接的英文翻译:translate.google.com/…
注意:此命令将重新安装当前在 Visual Studio 中打开的所有项目的引用,而不仅仅是在控制台中选择的项目。
此命令将在整个解决方案中重新安装包,而不仅仅是在选定的项目中!
极度危险!!!!如果该过程被中断,您将丢失所有包引用,并且需要为解决方案中的每个项目一一添加。
@BillVelasquez 这东西吃了我所有的参考资料。好吧,我想感谢上帝的 git。
G
Gan

您需要 Enable NuGet package restore at the VS solution level 才能使恢复丢失的包起作用。

https://i.stack.imgur.com/yIACk.png


这将允许 NuGet 将丢失的包重新下载到 .\packages\ 目录中,但与恢复丢失的项目引用无关,这是发布者所要求的。
C
Community

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

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

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

构建设置为自动恢复的解决方案

打开包管理器控制台并单击漂亮的“恢复”按钮

如果您安装了命令行 nuget,则执行 nuget restore

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

更新

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


您对还原非常重要,只确保包在包文件夹中(当然可以在很多地方)。然而,即使使用正确的包版本,关闭和重新打开仍然对我不起作用,我最终不得不手动修改每个 csproj 文件中的提示路径。我相信这是由于相对于项目移动包文件夹引起的。
编辑 .csproj 文件以确保匹配的版本号对我有用。谢谢!
J
Juri

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

如果您的情况与我相同,并且您希望将您的项目与您拥有/或在 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
    }
  }
}

然后使用 sepific 包名称执行它

Sync-References AutoMapper

或对于所有包,如

Sync-References

Dan Haywoodhis blog post 致谢。


B
Brant Bobby

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


J
Jeremy

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

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

M
Mark Horgan

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


这是最简单的解决方案。只需浏览包文件夹即可为我工作。
Y
Yves

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

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

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


M
McGaz

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

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

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

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


M
Michael Sorens

我必须同意@Juri 的观点,即 jmfenoll 广受欢迎的答案并不完整。在引用损坏的情况下,我认为大多数情况下您想要更新到 最新 包,而只是修复您对 current 的引用 您碰巧使用的版本。 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
        }
    }
}

F
Francesco

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

全新 Windows 10 机器和 VS Community 2015 安装

刚刚通过 TFS 检查了存储库代码

一种解决方案构建得很好,一种解决方案有一个缺少引用的项目(EF,System.Http,作为实例),但相关的 nuget 包已正确安装。

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

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


M
Mamdouh

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

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

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


K
Koopakiller

复制项目的 packages.config 文件并应用所有版本修改卸载所有包并删除依赖项 $packages = Get-Package -ProjectName [nameOfProjectToRestore] foreach ($package in $packages) { uninstall-package -projectname [nameOfProjectToRestore] -id $package .Id -version $package.version -RemoveDependencies -force ; } 清除项目根目录下的 packages 文件夹 将修改后的 package.config 复制到网站根文件夹 运行此代码恢复项目 $packages = Get-Package -ProjectName [nameOfProjectToRestore] foreach ($package in $packages) { uninstall-包 -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ; } foreach ($package in $packages) { install-package $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version }