恢复 Nuget 引用?

Posted

技术标签:

【中文标题】恢复 Nuget 引用?【英文标题】:Restoring Nuget References? 【发布时间】:2012-10-26 10:49:14 【问题描述】:

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

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

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

进入NuGet包管理器,界面依然报这些包旁边的勾,表示已经安装。

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

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

【问题讨论】:

【参考方案1】:

Try re-installing the packages.

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

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

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

【讨论】:

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

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

【讨论】:

这将允许 NuGet 将丢失的包重新下载到 .\packages\ 目录中,但与恢复丢失的 项目引用 无关,这就是海报的内容询问。【参考方案3】:

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

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

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

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

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

更新

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

【讨论】:

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

虽然@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
    
  

然后使用类似的包名执行它

Sync-References AutoMapper

或适用于所有包,如

Sync-References

感谢丹·海伍德和his blog post。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

【讨论】:

这是最简单的解决方案。只需浏览包文件夹即可为我工作。【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

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

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

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

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

我遇到了同样的问题,缺少参考资料。在我的情况下:

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

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

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

【讨论】:

【参考方案12】:

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

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

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

【讨论】:

【参考方案13】:
    复制项目的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-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    
    foreach ($package in $packages) 
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    
    

【讨论】:

以上是关于恢复 Nuget 引用?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Devops 找不到恢复的 nuget 包

nuget 包与其引用的 nuget 包之间的不同版本

引用nuget离线包

nuget 包引用引发的问题

NuGet 引用存储在哪里?

引用的库使用 VS 2017 在 Nuspec 中注册为其他 nuget 引用