还原 Nuget 引用?

我在 VisualStudio2012中有解决方案和项目。

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

出于这个问题的目的,让我们假设我意外地从我的项目的 References部分删除了这些库。

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

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

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

118020 次浏览

您需要使用 在 VS 解决方案级别启用 NuGet 包恢复来恢复丢失的包。

enter image description here

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

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

尝试重新安装包

在 NuGet Package Manager 控制台中输入以下命令:

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

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

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

虽然@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他的博客文章

如果这对某人有帮助的话,对我来说,以上任何一条都不够。我还是不能构建,VS 还是找不到参考资料。关键是在恢复包之后对 关闭并重新打开解决方案进行简单的操作。

下面是场景(使用 VisualStudio2012) :

打开包含丢失包的解决方案。参考资料显示 VS 找不到它们。有 很多方面恢复丢失的包,包括

  • 构建设置为自动还原的解决方案
  • 打开 PackageManager 控制台并点击“ Restore”按钮
  • 如果安装了命令行 nuget,则执行 nuget restore

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

更新

VisualStudio还是没有看到您有包吗?还在显示无法解析的引用吗?确保您还原的软件包版本与您的。Csproj 文件。即使是一个小的 bug 修复号(例如1.10.1到1.10.2)也会导致引用失败。您可以通过直接编辑 csproj xml 来解决这个问题,或者通过删除引用并创建一个指向包目录中新恢复的版本的新引用来解决这个问题。

  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. Clear the packages folder in the root of project

  4. Copy the modifies package.config to root folder of website

  5. Run this code to restore the project

    $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 被检查(但它不是恢复他们) ,我不能卸载和重新安装,因为我修改了一些安装的软件包... 所以:

我刚清理了缓存,重建了,成功了。 (工具-选项-Nuget 软件包管理器-总则)

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

以防万一——在我的场景中,我有一些共享库(它们有自己的 TFS 项目/解决方案) ,所有这些都组合成一个解决方案。

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

潜在的问题是,虽然您的解决方案有自己的包文件夹,并已将它们正确地还原到该文件夹,但项目文件(例如,。Csproj)引用了一个不同的项目,这个项目可能没有下载包。在文本编辑器中打开该文件,查看引用来自何处。

在管理不同相互链接的共享解决方案上的包时,可能会出现这种情况——因为您可能希望确保所有 DLL 都在同一级别上,您可以在顶级设置这一点。这意味着,有时它会在一个完全不同的解决方案中寻找一个引用的 DLL,因此,如果你没有所有的项目/解决方案下载和更新,那么你可能会得到上述问题。

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

我不得不删除“包”-文件夹手动之前。(它似乎是锁定,因为源代码控制)。

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

这个脚本将重新安装一个项目的所有包,而不会搞乱依赖关系或者安装可能已经被有意删除的依赖关系。(更多关于他们的部件包开发人员)

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

我不得不同意@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
}
}
}

我也有同样的问题,缺少参考文献,下面是我的设想:

  • Fresh Windows10机器和 VSCommunity2015安装
  • 刚刚通过 TFS 检查了存储库代码
  • 一个解决方案构建得很好,一个解决方案有一个缺少引用的项目(EF,System)。例如,Http) ,但是相关的 nuget 包已经正确安装。

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

如何修复: 简单地删除解决方案根目录中的包文件夹并执行 nuget 恢复。此时,dll 已经正确下载,并且可以添加缺少的引用。