NuGet 包恢复无法工作

191

我在一台电脑上检入了一个项目,在另一台电脑上检出时发现由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被触发了吗? - Pranav
重要的是:您是否在输出日志中看到任何错误? - maartenba
25个回答

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

Update-Package -Reinstall

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


Update-Package -Reinstall -ProjectName myProj

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

注意:这是一种“核选项”。使用此命令时,您可能无法获取已安装的相同版本的软件包,并且可能会导致问题。与解决方案级别相比,发生这种情况的可能性较小。

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

Update-Package -Reinstall -Safe


7
@NightOwl888,听起来好像需要向NuGet报告此问题,因为它不应该这样做。除非你一直存在DLL绑定问题,而幸运地它一直工作,但重新安装后,运行就没那么顺利了。 - Chris Marisic
4
如果你正在使用源代码控制,撤销更改就不会太难。 - ErikE
5
这里的主要缺点是软件包版本未得到维护,因此将安装最新的软件包版本。如果您的项目与新版本不兼容,这可能会成为问题。 - JDandChips
6
是的,Update-Package -Reinstall 对我有效。我不知道为什么IDE不会自动这样做。一切都设置正确了。唉,我发誓,NuGet既好用又烦人。 - Jeremy Ray Brown
4
感谢你在回答底部加上“重要!这可能会破坏你的项目”的提示,做得很好! - devman
显示剩余12条评论

31

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

23

您需要从以下方式中选择一种:

通过包名称在所有解决方案的项目中重新安装一个包:

Update-Package –reinstall <packageName>

以包名重新安装一个包,并在所有解决方案的项目中忽略其依赖项:

Update-Package –reinstall <packageName> -ignoreDependencies
在项目中按名称重新安装包:
Update-Package –reinstall <packageName> <projectName>

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

Update-Package -reinstall -ProjectName <projectName>

重新安装解决方案中的所有程序包:

Update-Package -reinstall 

以快速而不拘泥于细节的方式解决了我的问题。 - blackorchid
可能会安装比指定版本更新的软件包,从而破坏项目。 - Suncat2000

21

3
谢谢提供链接。在存在缺失包/二进制文件的项目中启用“包恢复模式”将是一种常见情况。如果您没有这些包,那么您希望获取它们。使用案例失败。 - Anthony
2
当你说“在缺失包的项目中启用包还原模式”时,你是什么意思?我需要运行控制台命令来执行吗? - CodeWarrior
107
NuGet每天都让我失望,我非常厌恶它。 - Jammer
1
@Jammer 十年过去了,NuGet 仍然无法可靠地还原软件包。我们最终创建了一些 Python 脚本,真正正确地完成了这项工作。 - A.R.

18

VS 2017

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


在使用Visual Studio Team Explorer with DevOps/Git管理源代码时,检出解决方案后无法进行构建,因为缺少引用并且还原包没有起作用。这个解决方案是适合这种情况的正确方案。 - PJRobot
非常感谢。它解决了我在本地测试NuGet包的问题! - Oshawott

11
如果其他答案都不起作用,那么请尝试以下方法,这是我唯一行之有效的方法:
在文本编辑器中查找你的 .csproj 文件并打开它。
在 .csproj 文件中查找 标签,并删除整个块。
重新安装解决方案中的所有包:
Update-Package -reinstall

在此之后,您的NuGet包应该已经恢复了,我认为这可能只是在将项目移动到不同位置时才会发生的边缘情况。


这让我免于彻底疯掉。谢谢! - Jeff Hay
这是我在众多解决方案中唯一有效的解决方法。我由衷地感谢你。 - help

11

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

首先,当我尝试使用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>

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

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

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

我想说的是,在您的构建中打开诊断级别日志记录将有助于显示msbuild正在执行什么命令。这就是我暂时修改目标文件的原因。


我也遇到了双引号的问题,不得不进行与你相同的编辑。非常令人沮丧! - Greg

7

如果其他方法都不起作用,请尝试以下步骤:

  1. 关闭项目。
  2. 删除解决方案文件夹中的packages文件夹。
  3. 再次打开项目并恢复Nugget Packages。

这对我很有效,而且很容易尝试。


2
这对我有用。在第三步中,我不必手动恢复包 - 当我打开项目时,它们会自动恢复。 - Tawab Wakil

4

对我来说,.csproj文件中存在一个空的NuGetPackageImportStamp标签。

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

最好包含一些有效的GUID。

我尝试删除此标签,然后执行“还原Nugets”,效果很好。


4

对于可能遇到这个问题的其他人,我能够通过关闭Visual Studio并重新打开项目来解决问题。当项目加载时,在初始化阶段还原了包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接