ChatGPT解决这个技术问题 Extra ChatGPT

NuGet 包还原不起作用

我在一台计算机上签入一个项目,在另一台计算机上签出,发现 NuGet 安装的二进制文件丢失了。我也可以将它们签入源代码管理,但看起来有更好的解决方案:

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

我按照这些说明操作,现在应该有一个 .nuget 文件夹,在我的 .csproj 文件中有以下条目:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

然而,当我重建我的解决方案时,丢失的包并没有恢复。

我错过了什么?我该如何诊断这个问题?

您是否看到在输出日志中触发了 nuget.exe?
重要的是:您是否在输出日志中看到任何错误?

A
Abel

请注意,您可以通过在 nuget 包管理器控制台中运行以下命令来强制执行包还原

更新包-重新安装

强制重新安装解决方案中的所有内容。

更新包-重新安装-ProjectName myProj

强制重新安装 myProj 项目中的所有内容。

注意:这是核选项。使用此命令时,您可能无法获得与您安装的软件包相同的版本,这可能会导致问题。与解决方案级别相比,这不太可能发生在项目级别。

您可以使用 -safe 命令行参数选项来限制升级到具有相同主要和次要版本组件的较新版本。这个选项是后来添加的,解决了评论中提到的一些问题。

更新-包-重新安装-安全


@NightOwl888 这听起来像是需要向 nuget 报告的事情,因为它应该无法做到这一点,除非您实际上总是遇到 DLL 地狱绑定问题并且幸运的是它正在工作,但是重新安装它会结束您的运气。
@nightowl 如果您使用的是源代码控制,那么支持更改应该不难。
这里的主要缺点是不维护软件包版本,因此将安装最新的软件包版本。如果您的项目与新版本不兼容,这可能是一个问题。
是的,Update-Package -Reinstall 对我有用。我不知道为什么 IDE 不这样做。一切都设置正确。 Ugghh,我发誓,NuGet 既好又烦人。
很高兴您在答案的底部添加“重要!这可能会破坏您的项目”!
D
Dave New

对于其他偶然发现这篇文章的人,请阅读本文。

NuGet 2.7+ 向我们介绍了自动包还原。对于大多数应用程序来说,这被认为是一种更好的方法,因为它不会篡改 MSBuild 过程。少头痛。

一些帮助您入门的链接:

恢复 NuGet 包的正确方法

从基于 MSBuild 的 NuGet 包还原迁移

迁移 MSBuild 集成解决方案以使用自动包还原


感谢您提供适合当前版本的 NuGet 的答案。
M
Mohammad Dayyan

您必须选择以下一种方式:

在所有解决方案的项目中按其名称重新安装包:

Update-Package –reinstall <packageName>

按名称重新安装包并忽略它在所有解决方案项目中的依赖项:

Update-Package –reinstall <packageName> -ignoreDependencies

在项目中按名称重新安装包:

Update-Package –reinstall <packageName> <projectName>

重新安装特定项目中的所有包:

Update-Package -reinstall -ProjectName <projectName>

在解决方案中重新安装所有软件包:

Update-Package -reinstall 

解决了我的问题快速和肮脏的风格。
可能会破坏项目,因为它可能会安装比指定版本更新的包。
S
StayOnTarget

您是否在缺少包/二进制文件的项目中启用了包还原模式?启用还原模式时需要正确安装软件包的已知问题:

http://nuget.codeplex.com/workitem/1879

原始链接已失效;这可能是替代品:https://github.com/NuGet/Home/issues/1968


感谢您的链接。在缺少包/二进制文件的项目中启用包还原模式将是一种常见情况。如果您没有包裹,那就是您想要获得它们的时候。用例失败。
当您说“在缺少包的项目中启用包还原模式”时,您是什么意思?是否有我需要运行的控制台命令来执行此操作?
NuGet 每天都让我失望,我完全鄙视它。
N
Niaz Morshed

VS 2017

工具>NuGet 包管理器>包管理器设置>常规点击“清除所有 NuGet 缓存”


当从源代码控制中检查解决方案时(使用带有 DevOps/Git 的 Visual Studio 团队资源管理器进行管理),由于缺少引用而无法构建,并且还原包什么也没做。对于这种情况,这个解决方案是正确的。
非常感谢。它解决了我测试本地 NuGet 包的问题!
P
PerryM

我在两种情况下遇到了这个问题。

首先,当我尝试使用 msbuild.exe 从命令行构建我的解决方案时。其次,当我尝试使用 TFS 和 CI 在我的构建服务器上构建 sln 和包含项目时。

我收到错误,声称缺少引用。在检查我的本地构建目录和 TFS 服务器时,我看到 /packages 文件夹没有被创建,并且 nuget 包没有被复制过来。按照 Alexandre 的回答 http://nuget.codeplex.com/workitem/1879 中列出的说明对我也不起作用。

我已经通过 VS2010 启用了恢复包,并且我看到构建只能在 VS2010 中工作。同样,使用 msbuild 失败。我的解决方法可能完全无效,但对于我的环境,这使得一切都可以从本地命令行构建以及 TFS 中的 CI 构建工作。

我进入 .\nuget 并在 .nuget\NuGet.targets 文件中更改了这一行:

从:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

to:(注意,变量周围没有引号)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

我知道如果我的目录中有空格,这将失败,但我的目录中没有空格,所以这个解决方法让我的构建成功完成......暂时。

我会说,在您的构建中打开诊断级别日志记录将有助于显示 msbuild 正在执行哪些命令。这就是导致我暂时破解目标文件的原因。


我遇到了双引号问题,必须进行与您所做的相同的编辑。非常令人沮丧!
A
Alvaro Rodriguez Scelza

如果还有其他方法不起作用,请尝试:

关闭项目。删除解决方案文件夹中的包文件夹。再次打开 Project 并再次恢复 Nugget 包。

为我工作,很容易尝试。


这对我有用。在第 3 步中,我不必手动恢复包——当我打开项目时它们会自动恢复。
J
Jako Basson

如果其他答案都不适合您,请尝试以下方法,这是唯一对我有用的方法:

找到您的 .csproj 文件并在文本编辑器中对其进行编辑。

在您的 .csproj 文件中找到 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 标记并删除整个块。

重新安装解决方案中的所有软件包:

Update-Package -reinstall

在此之后你的 nuget 包应该被恢复,我认为这可能是一个边缘情况,只有当你将项目移动到不同的位置时才会发生这种情况。


这使我免于完全发疯。谢谢!
M
Mike Perrenoud

对于可能遇到此问题的其他人,我可以通过关闭 Visual Studio 并重新打开项目来解决此问题。当项目被加载时,包在初始化阶段被恢复。


P
Pang

对我来说,我在 .csproj 中有一个空标签 NuGetPackageImportStamp

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

理想情况下,它应该包含一些有效的 GUID。

删除此标签,然后“恢复 Nugets”对我有用。


j
jv_

在我的情况下,其他解决方案均无效:

AspNetCore 依赖项已安装/卸载并被缓存。 “AspNetCore.All”将拒绝正确更新/重新安装/删除。而且无论我做什么,它都会使用缓存的依赖项(它不兼容),因为它们是更高版本。

备份一切。请注意您需要重新安装的依赖项列表,退出 VisualStudio 在文本编辑器中打开所有 .proj 文件并删除所有 PackageReference 在每个项目中,删除 bin、obj 文件夹 删除您在解决方案中找到的任何“包”文件夹。打开解决方案,进入工具 > Nuget 包管理器 > 包管理器设置并清除所有 Nuget 缓存。检查控制台,因为它可能无法删除某些项目 - 复制文件夹路径并退出 Visual Studio。从该文件夹中删除任何内容重新打开解决方案并从头开始重新安装 nuget 包。

如果这仍然不起作用,请重复,但也要在 Windows 资源管理器中搜索您的驱动器以查找 nuget 并删除任何缓存的内容。


J
James Joyce

在 VS2017 中,右键单击解决方案 => 打开命令行 => 开发者命令行。

一旦打开,输入(然后按回车键)

dotnet restore

这将恢复任何/所有包,你会得到一个很好的控制台输出,说明已经完成了什么......


J
Jeremy Ray Brown

有时会发生一些奇怪的事情,使用 Visual Studio 自动恢复不起作用。在这种情况下,您可以使用 NuGet 包管理器控制台。这是在 Visual Studio 中从工具 -> NuGet 包管理器 -> 包管理器控制台打开的。控制台中的命令很简单。要在键入命令时获得上下文帮助,只需按下按钮,它将为您提供所有以您输入的字母开头的选项。因此,如果未安装软件包,例如 log4net,请键入以下命令:

安装包 log4net

你可以做更多的事情,比如指定要安装的版本、更新包、卸载包等。

当 Visual Studio 表现得像个怪人时,我不得不使用控制台来帮助我。


C
CShark

自动包还原将由于以下任何原因而失败:

您没有从解决方案的 .nuget 文件夹(可以在解决方案根文件夹中找到)中删除 NuGet.exe 和 NuGet.targets 文件 您没有从工具 >> 选项 >> Nuget 包管理器 >> 启用自动包还原通用设置。您忘记手动删除所有项目中对 Nuget.targets 文件的引用您需要重新启动 Visual Studio(确保在再次启动之前从任务管理器中终止该进程)。

以下文章更详细地概述了如何处理第 1-3 点:https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore


关于您的第 1 点,您提供的链接与您的建议相矛盾:“如果您使用 TFS 1. 从解决方案的 .nuget 文件夹中删除 NuGet.exe 和 NuGet.targets 文件 2.保留 NuGet.Config 文件以继续绕过将包添加到源代码管理。”
A
Aaron

在我的系统上执行系统还原后,我的 NuGet 包被破坏,备份了大约两天。 (同时安装了 NuGet 包。)要修复它,我必须转到我的用户配置文件中的 .nuget\packages 文件夹,找到这些包,然后将其删除。只有这样,Visual Studio 才会将包重新拉下来并正确地将它们添加为引用。


K
Koby Douek

我发现从头开始创建新项目的最佳解决方法,然后使用代码导入所有源文件。我的项目并没有那么复杂,所以我从那里没有问题。


E
Eric J.

我最近也遇到了这个问题。通常的“dotnet restore”和“Update-Package -reinstall”没有帮助。

我查看了 .csproj 文件,发现这些包的值不一致。有些指向 <solutiondir>\packages,有些指向 <projectdir>\packages

我让它们都指向同一个地方(我相信是指向 <projectdir>\packages),然后我能够恢复 NuGet 包。

我不确定 .csproj 文件如何最终指向两个不同的地方。也许是从 Visual Studio 2017(或更早版本)开始,然后迁移到 Visual Studio 2019?还是不同程序员使用的不同设置?我真的不知道。


F
Floern

vs2015 no enable nuget restore 问题。我的解决方案:

添加文件夹.nuget,在目录.nuget中添加文件NuGet.Config和NuGet.targets每个项目文件添加:构建

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>

这是旧的做法。请参阅@davenewza 的回答,以及他指向 blog.davidebbo.com/2014/01/… 的链接
v
vamsee

如果您面临的错误是“无法连接到远程服务器”,那么除了上述评论中提供的检查之外,您还可以进行此检查。

我看到有 2 个 NUGET 包源可以从中下载包(在工具-> Nuget 包管理器-> 包管理器设置中)。其中一个包源无法运行,Nuget 试图仅从该源下载。

将软件包源更改为从以下位置下载后,事情就到位了:https://www.nuget.org/api/v2/ 在设置中明确


F
Frederik Struck-Schøning

就我而言,中止的 Nuget 恢复尝试损坏了解决方案中的一个packages.config文件。在检查我的 git 工作树之前,我没有发现这一点。还原文件中的更改后,Nuget restore 再次运行。


P
Pang

有一个快捷方式可以让 Nuget 恢复工作。

确保 VS 工具选项菜单中的 Internet 连接或 Nuget url 正确查看解决方案中的 .nuget 或 nuget 文件夹,否则 - 从任何复制以获取 nuget.exe 删除包文件夹(如果存在) 打开包管理器控制台执行此命令

粘贴 nuget.exe 的完整路径 恢复 .sln 文件的完整路径!

使用 Install-pacakge 命令,如果构建没有通过任何缺失的引用。


p
pey

我遇到了同样的问题,但解决了我的问题的是转到 Nuget 包管理器(右键单击 prj > 选择管理 Nugget 包)并卸载并再次安装有问题的包。

但是有一些包对其他包有依赖关系,所以我所做的是先卸载依赖项,然后再卸载我想卸载并重新安装的 nuget 包。

当您尝试卸载 nuget 时,您可以查看它是否具有依赖项,然后访问“输出”窗口,会出现一行说 nuget 由于其依赖项而无法卸载,并且这些依赖项也列在那里。


R
Resource

我知道这是一个旧线程,但它是今天(2022 年)“取消 nuget 包恢复”的第一个搜索结果。这是我在新工作中尝试重建解决方案时在 VS 中得到的消息。

我已经在新工作中工作了几个星期,并且构建工作到现在为止。

我的解决方案使用的包源是 xxxxPackages,其中 xxxx 是我的雇主的名字。所以包源不是我通常使用的nuget.org。 VS 中偶尔会出现一条消息:

“TF30063:您无权访问 xxxxdev.visualstudio.com。”

尽管如此,我还是在浏览器中打开了 xxxxdev.visualstudio.com 并且能够在其中工作。

我在这里尝试了很多建议。然后,和一位同事聊天,结果发现我的 VS 登录已经过时了。在 Visual Studio 中,我单击右上角的图标并选择“帐户设置”。有一个感叹号表示我必须使用我的 xxxx 电子邮件地址刷新我在 visualstudio.com 上的工作帐户的登录。

一旦我这样做了,问题就消失了。我希望这可以为其他人省去我今天早上遇到的麻烦。