恢复Nuget参考?


182

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

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

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

当进入NuGet软件包管理器时,界面仍在报告这些软件包旁边的对勾,表明它们已安装。

我可以看到解决此问题的唯一方法是从中删除所有条目packages.config,这将解决NuGet接口报告已安装的问题,然后重新添加每个条目。

有没有更聪明的方法?我曾希望启用“启用nuget来还原丢失的软件包”能够解决此问题,但它似乎无能为力。

Answers:


329

尝试重新安装软件包

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

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

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


10
链接英语翻译:translate.google.com/...
乔鲍托特

18
注意:此命令将在Visual Studio中当前打开的所有项目上重新安装引用,而不仅仅是在控制台中选择的项目上。
2013年

3
该命令将重新安装整个解决方案中的软件包,而不仅仅是在选定的项目中!
Alex Sorokoletov 2014年

14
极度危险!!!!如果该过程被中断,您将丢失所有包引用,并且需要将一个一个的添加到解决方案中的每个项目中。
Bill Velasquez 2014年

2
@BillVelasquez这东西吃了我所有的参考。好吧,我想上帝感谢git。
Gleno 2014年


13

如果这对某人有所帮助,对我而言,以上任何一项都不足够。我仍然无法建立,VS仍然找不到引用。关键只是在还原软件包后关闭并重新打开解决方案

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

您打开了一个缺少包的解决方案。参考资料表明VS无法找到它们。有很多方法可以还原丢失的软件包,包括

  • 建立设置为自动还原的解决方案
  • 打开软件包管理器控制台,然后单击漂亮的“还原”按钮
  • 这样做nuget restore,如果你已经安装了命令行的NuGet

但是,无论采用哪种方法,这些参考仍然会显示为丢失。而当您建立它会失败。叹。但是,如果您关闭解决方案并重新打开它,现在VS <HintPath>再次检查这些nice ,发现程序包又回到了它们所属的位置,并且一切正常。

更新资料

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


1
您仅在确保软件包位于软件包文件夹中的情况下(当然可以在许多地方),对还原提出非常重要的一点。但是,即使使用正确的软件包版本,关闭和重新打开对我来说仍然不起作用,我最终不得不手动修改每个csproj文件中的提示路径。我相信这是由于相对于项目移动package文件夹引起的。
肖恩

编辑.csproj文件以确保匹配的版本号对我有用。谢谢!
Mateen Ulhaq '16

11

当@jmfenoll提供的解决方案起作用时,它将更新为最新的软件包。就我而言,安装了beta2(预发行版)后,它将所有库更新为RC1(其中有一个错误)。因此,上述解决方案仅完成一半的工作。

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

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

积分去丹海伍德他的博客


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


3

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


这是最简单的解决方案。通过浏览packages文件夹,它对我有用。
阮阮

2

在Visual Studio 2015中(解决方案在源代码控制下,MVC-Project),csano Update-Package -Reinstall -ProjectName Your.Project.Name起作用了,但是它弄乱了一些写锁。

我不得不手动删除“包”-文件夹。(由于源代码控制,它似乎已被锁定)。

另外,我还必须从NuGet软件包管理器中重新安装MVC-Package。


2

该脚本将重新安装项目的所有软件包,而不会弄乱依赖关系或安装可能已经被intentianlyz删除的依赖关系。(有关其部分包装开发人员的更多信息。)

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

1

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

Nuget将成功还原项目,但DLL将丢失。

潜在的问题是,尽管您的解决方案具有自己的packages文件夹并将其正确还原到该文件夹​​,但是项目文件(例如.csproj)正在引用可能没有下载软件包的其他项目。在文本编辑器中打开文件,以查看引用的来源。

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


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

1

我也遇到缺少参考文献的问题。在我的情况下:

  • 新鲜的Windows 10计算机和VS Community 2015安装
  • 刚刚通过TFS签出了存储库代码
  • 一种解决方案构建良好,一种解决方案只有一个项目缺少引用(例如,EF,System.Http),但是正确安装了相对的nuget软件包。

项目和程序包中的所有版本号都匹配,无法执行nuget restore(以所有方式)。

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



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. 将modify 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
    }
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.