2012-01-25 94 views
127

我在一台计算机上签了一个项目,在另一台计算机上签出,发现NuGet安装的二进制文件丢失了。我可以检查它们以源头控制为好,但它看起来像有一个更好的解决方案:NuGet软件包还原不起作用

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

我跟着这些指示,现在有一个.nuget文件夹,其中一个应该是,必须在以下条目我.csproj文件:

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

然而当我重建我的解决方案时,丢失的包不会被恢复。

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

+0

您是否看到在输出日志中触发nuget.exe? – Pranav

+0

而且重要的是:您是否在输出日志中看到任何错误? – maartenba

回答

210

注意您可以强制恢复包通过在NuGet包管理器控制台

更新,包装-Reinstall

部队在解决方案的所有的重新安装运行下面的命令来执行。


更新,包装-Reinstall -ProjectName的Myproj

强制进行重新安装在的Myproj项目应有尽有。

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

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

更新,包装-Reinstall - 安全

+0

请注意,在解决方案上运行重新安装可能需要很长时间,您需要回答关于文件替换的问题,并且它与我的Git源代码控制存在错误/冲突。 –

+0

不是一个好的解决方案 - 这打破了我的项目,所以它不会运行了。 – NightOwl888

+5

@ NightOwl888听起来像需要报告给nuget,因为它应该没有办法做到这一点,除非你实际上总是有DLL地狱绑定的问题,并运气它工作,但重新安装它结束了你的运气的工作。 –

19

您是否在缺少软件包/二进制文件的项目中启用软件包恢复模式?有一个众所周知的问题,需要的包被正确安装启用恢复模式时:

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

+3

感谢您的链接。在缺少软件包/二进制文件的项目中启用软件包恢复模式将是一种常见的情况。如果你没有这些软件包,那是你想要得到它们的时候。用例失败。 – Anthony

+2

当你说“在缺少程序包的项目中启用程序包恢复模式”时,你是什么意思?是否有我需要运行的控制台命令来执行此操作? – CodeWarrior

+71

NuGet每天都会让我失望,我完全鄙视它。 – Jammer

11

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

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

据我所知,如果我的目录中有空格,这将失败,但我没有空间在我的目录中,所以这种解决方法让我的构建成功完成......对于ti我是。

我会说打开构建中的诊断级日志会帮助显示msbuild正在执行的命令。这就是导致我暂时攻击目标文件的原因。

+0

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

3

只是为别人可能碰到这个问题,我可以通过关闭Visual Studio和重新打开该项目,以解决该问题。当项目加载时,包在初始化阶段被恢复。

21

对于其他谁偶然发现这篇文章,阅读此。

NuGet 2.7+将我们介绍给自动包装还原。这被认为是对大多数应用来说更好的方法,因为它不会篡改MSBuild进程。减少头痛。

一些链接,让你开始:

+2

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

1

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

安装,包装log4net的

你可以做很多更多,如指定要安装的版本,更新包,卸载一个包等

我必须使用控制台来帮助我,当Visual Studio的行为像一个怪人。

15

你必须选择下列一种方法:

重新安装所有解决方案的项目包被它的名字:

Update-Package –reinstall <packageName> 

重新安装由它的名字的包,而忽略它的依赖在所有解决方案的项目:

Update-Package –reinstall <packageName> -ignoreDependencies 

重新安装项目中的包被它的名字:

Update-Package –reinstall <packageName> <projectName> 

重新安装所有包在一个特定的项目:

Update-Package -reinstall -ProjectName <projectName> 

重新安装所有包在一个解决方案:

Update-Package -reinstall 
+0

解决了我的问题快速和肮脏的风格。 – blackorchid

1

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

  1. 你没有r从解决方案的.nuget文件夹中删除NuGet.exe和NuGet.targets文件(可在您的解决方案根文件夹中找到)
  2. 您没有从Tools >> Options >> Nuget Package Manager >>中启用自动软件包恢复功能常规设置。
  3. 您忘记手动删除所有项目中的引用到Nuget.targets文件
  4. 您需要重新启动Visual Studio(确保在再次启动之前,您的任务管理器中的进程已被终止)。

下面的文章中概述了详细介绍如何去分1-3: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

+1

关于你的#1点,您提供的链接违背你的建议: “如果你正在使用TFS 1.从解决方案的 .nuget文件夹 2.保留的NuGet取出NuGet.exe和NuGet.targets文件。配置文件继续绕过添加包到源代码管理。“ –

+0

你是对的。我已经更新了我的答案。 –

0

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

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

  2. 每个项目文件中加入: 构建

<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> 
+0

这是做它的老方法。请参阅@davenewza答案,以及他的链接http://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html – timB33

0

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

我看到有2个NUGET包源可以下载包(在Tools-> Nuget Package Manager-> Packager Manager Settings中)。其中一个Package Source没有运行,Nuget试图从该源下载。

事情就明白了,一旦我改变了从下载软件包源:https://www.nuget.org/api/v2/显式地在设置

1

我的NuGet包破后,我做了我的系统上的系统还原,备份它两天左右。 (同时安装了NuGet包。)要修复它,我必须转到我的用户配置文件中的.nuget \ packages文件夹,找到这些包并删除它们。只有这样,Visual Studio才能将这些软件包拉下来并将它们作为参考正确添加。

0

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

0

有一个快捷方式,使其恢复的NuGet工作, 1.确保Internet连接或的NuGet网址是正确的VS工具选项菜单 2.看在溶液.nuget或文件夹的NuGet,否则 - 从任何副本获得nuget.exe

  • 删除包文件夹,如果存在

  • 打开包管理器控制台执行此命令

    • 粘贴完整路径的nuget.exe RESTORE完整路径的.sln文件!
  • 使用Install-pacakge命令,如果构建没有通过任何缺少的引用。 希望它有助于(HIH)
  • 1

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

    6

    VS 2017年

    工具> NuGet包管理器>软件包管理器设置>常规 点击 “清除所有的Nu​​Get缓存(S)”

    +0

    谢谢,工作就像一个魅力。 – reika

    0

    如果什么都没有工作,请尝试:

    1. 关闭项目。
    2. 删除解决方案文件夹中的packages文件夹。
    3. 再次打开项目并重新还原块包。

    为我工作,这很容易尝试。

    0

    如果没有其他答案的为你工作,然后尝试这是只为我工作的事情如下:

    找到你.csproj文件,并在文本编辑器进行编辑。

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

    重新安装所有的软件包:

    Update-Package -reinstall 
    

    这是你的NuGet包应该被恢复后,我想这可能是因为只有当你移动你的项目到不同的位置出现条纹情况。