NuGet软件包还原不起作用


165

我在一台计算机上签入一个项目,在另一台计算机上签出,发现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被触发?
普拉纳夫

重要的是:您在输出日志中看到任何错误吗?
maartenba'3

Answers:


272

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

更新包-重新安装

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


更新包-重新安装-ProjectName myProj

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

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

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

更新包-重新安装-安全


7
@ NightOwl888听起来像是需要报告nuget的东西,因为它不可能做到这一点,除非您可能实际上总是遇到DLL地狱绑定问题,但幸运的是它正在工作,但是重新安装它却使您失去了运气。
克里斯·马里西克

4
@nightowl,如果您使用的是源代码控制,则不难取消更改。
ErikE 2014年

4
这里的主要缺点是不维护软件包版本,因此将安装最新的软件包版本。这可能是一个问题,如果你的项目是不是一个新的版本兼容..
JDandChips

4
是的,Update-Package -Reinstall对我有用。我不知道为什么IDE不这样做。一切设置正确。g,我发誓,NuGet既好又烦人。
Jeremy Ray Brown

2
很高兴在您回答的底部添加“重要!这可能会破坏您的项目”!
devman

25

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

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

一些使您入门的链接:


2
感谢您提供适合当前版本的NuGet的答案。
Eric J.

20

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

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

Update-Package –reinstall <packageName>

用名称重新安装软件包,并忽略其在所有解决方案项目中的依赖关系:

Update-Package –reinstall <packageName> -ignoreDependencies

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

Update-Package –reinstall <packageName> <projectName>

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

Update-Package -reinstall -ProjectName <projectName>

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

Update-Package -reinstall 

解决了我的问题快捷方式。
blackorchid

20

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

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


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


3
感谢您的链接。通常在缺少包/二进制文件的项目中启用包还原模式。如果您没有软件包,那就是您要获取它们的时候。用例失败。
安东尼

2
当您说“在缺少包的项目中启用包还原模式”时,您的意思是?我需要运行控制台命令来执行此操作吗?
CodeWarrior 2012年

90
NuGet每天都会使我失望,我完全鄙视它。
詹默(Jammer)2013年

14

VS 2017

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


当从源代码管理中检查解决方案时(使用带有DevOps / Git的Visual Studio Team Explorer管理),由于缺少引用,无法进行构建,而还原包则无济于事。对于这种情况,此解决方案是正确的。
PJRobot

12

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

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

我收到声称引用丢失的错误。在检查我的本地构建目录和TFS服务器的目录时,我发现未创建/ packages文件夹,并且nuget包未复制。按照亚历山大答案(http://nuget.codeplex.com/workitem/1879)中列出的说明,对我也不起作用。

我已通过VS2010启用了还原软件包,并且看到仅在VS2010内才能进行构建。同样,使用msbuild失败。我的解决方法可能完全无效,但是对于我的环境,这一切都可以从本地的命令行构建以及TFS中的CI构建中进行。

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

从:

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

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

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

我知道如果我的目录中有空格,这将会失败,但是我的目录中没有空格,因此这种解决方法可以暂时使我的构建成功完成。

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


我在双引号上遇到了问题,必须进行与您相同的编辑。很沮丧!
格雷格

5

如果其他方法无效,请尝试:

  1. 关闭项目。
  2. 在您的解决方案文件夹中删除程序包文件夹。
  3. 再次打开“项目”,然后再次还原“金块包”。

为我工作,很容易尝试。


2
这对我有用。在第3步中,我不必手动还原软件包-当我打开项目时,它们会自动还原。
Tawab Wakil

5

如果没有其他答案对您有用,请尝试以下对我唯一有效的方法:

查找您的.csproj文件,然后在文本编辑器中对其进行编辑。

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

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

Update-Package -reinstall

在此之后,应还原您的nuget程序包,我认为这可能只是一种边缘情况,仅当您将项目移至其他位置时才会发生。


这使我免于完全发疯。谢谢!
杰夫·海伊


4

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

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

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

删除上述标签,然后“ Restore Nugets”对我有用。


1

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

安装包log4net

您可以做很多事情,例如指定要安装的版本,更新软件包,卸载软件包等。

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


1

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

  1. 您没有从解决方案的.nuget文件夹(可以在解决方案的根文件夹中找到)中删除NuGet.exe和NuGet.targets文件。
  2. 您没有通过工具>>选项>> Nuget软件包管理器>>常规设置启用自动软件包还原。
  3. 您忘记手动删除所有项目中对Nuget.targets文件的引用
  4. 您需要重新启动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文件以继续绕过将程序包添加到源代码管理中。”
安德鲁·丹尼森

1

在系统上执行系统还原后,我的NuGet软件包损坏了,备份了大约两天。(同时安装了NuGet软件包。)要修复此问题,我必须转到用户配置文件中的.nuget \ packages文件夹,找到相应的软件包并将其删除。只有这样,Visual Studio才能将软件包重新打包,并适当地将它们添加为引用。


1

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


1

在我的情况下,没有其他解决方案起作用:

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

  1. 备份所有内容。请注意您需要重新安装的依赖项列表,退出VisualStudio
  2. 在文本编辑器中打开所有.proj文件,然后删除所有 PackageReference
  3. 在每个项目中,删除binobj文件夹
  4. 删除您在解决方案中找到的所有“包”文件夹。
  5. 开放式解决方案,进入Tools > Nuget Package Manager > Package Manager SettingsClear all Nuget caches。检查控制台,因为它可能无法删除某些项目-复制文件夹路径并退出Visual Studio。
  6. 从该文件夹中删除任何内容重新打开解决方案,然后从头开始重新安装nuget软件包。

如果那仍然不起作用,请重复此操作,nuget然后在Windows资源管理器中搜索驱动器,并删除所有看起来很脏的东西。


0

vs2015没有启用nuget恢复问题。我的解决方案:

  1. 添加文件夹.nuget,在目录.nuget中添加文件NuGet.Config和NuGet.targets

  2. 每个项目文件添加:build

  <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/...
timB33

0

如果您遇到的错误是我的“无法连接到远程服务器”,那么除了上面的注释中提供的检查之外,还有此检查也会使您受益。

我看到有2个NUGET软件包源,可以从中下载软件包(在“工具”->“ Nuget软件包管理器”->“软件包管理器设置”中)。软件包源之一不起作用,Nuget尝试仅从该源下载。

一旦更改了包源以从以下位置下载内容,事情就就准备就绪了:https: //www.nuget.org/api/v2/


0

在我的情况下,中止的Nuget还原尝试损坏packages.config了解决方案中的文件之一。在检查我的git工作树之前,我没有发现这一点。还原文件中的更改后,Nuget restore再次起作用。


0

有一个使Nuget恢复工作的快捷方式,1.确保VS Tools选项菜单中的Internet连接或Nuget URL正确。2.查看解决方案中的.nuget或nuget文件夹,否则-从任何目录复制以获取nuget.exe。

  1. 删除软件包文件夹(如果存在)

  2. 打开程序包管理器控制台,执行此命令

    • 粘贴nuget.exe的完整路径恢复.sln文件的完整路径!
  3. 如果构建因缺少任何参考而无法通过,请使用Install-pacakge命令。希望有帮助(HIH)

0

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

多数民众赞成在打开后,键入(然后按Enter)

dotnet restore

这将还原任何/所有软件包,并且您会得到一个不错的控制台输出,说明已完成的操作...

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.