NuGet包还原不起作用

时间:2012-01-25 23:19:00

标签: nuget

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

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

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

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

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

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

21 个答案:

答案 0 :(得分:250)

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

  

Update-Package -Reinstall

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


  

Update-Package -Reinstall -ProjectName myProj

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

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

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

  

Update-Package -Reinstall -Safe

答案 1 :(得分:24)

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

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

一些可以帮助您入门的链接:

答案 2 :(得分:20)

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

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


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

答案 3 :(得分:19)

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

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

Update-Package –reinstall <packageName>

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

Update-Package –reinstall <packageName> -ignoreDependencies

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

Update-Package –reinstall <packageName> <projectName>

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

Update-Package -reinstall -ProjectName <projectName>

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

Update-Package -reinstall 

答案 4 :(得分: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>

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

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

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

我会说在您的构建中启用诊断级别日志记录将有助于显示msbuild正在执行的命令。这就是我暂时黑客攻击目标文件的原因。

答案 5 :(得分:11)

VS 2017

工具&gt; NuGet包管理器&gt;包管理器设置&gt;常规 单击&#34;清除所有NuGet缓存&#34;

答案 6 :(得分:5)

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

  1. 关闭项目。
  2. 删除解决方案文件夹中的包文件夹。
  3. 再次打开Project并再次恢复Nugget包。
  4. 为我工作,很容易尝试。

答案 7 :(得分:3)

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

答案 8 :(得分:3)

如果其他答案都不适合您,那么请尝试下面哪一项对我有用:

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

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

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

Update-Package -reinstall

在此之后你的nuget软件包应该恢复,我认为这可能是一个仅在你将项目移动到另一个位置时才会发生的边缘情况。

答案 9 :(得分:2)

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

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

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

删除上述标签,然后“恢复Nugets”为我工作。

答案 10 :(得分:1)

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

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

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

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

由于以下任何原因,自动包恢复将失败:

  1. 您没有从解决方案的.nuget文件夹中删除NuGet.exe和NuGet.targets文件(可在解决方案根文件夹中找到)
  2. 您未从工具&gt;&gt;启用自动包恢复功能选项&gt;&gt; Nuget包管理器&gt;&gt;一般设置。
  3. 您忘记手动将所有项目中的引用删除到Nuget.targets文件
  4. 您需要重新启动Visual Studio(确保在重新启动之前从您的任务管理器中终止该进程)。
  5. 以下文章更详细地概述了如何进行第1-3点: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

答案 14 :(得分:1)

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

Install-Package log4net

您可以执行更多操作,例如指定要安装的版本,更新软件包,卸载软件包等。

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

答案 15 :(得分:0)

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

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

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

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

如果您遇到的错误是&#34;无法连接到远程服务器&#34;就像我的一样,除了上述评论中提供的检查外,还可以帮助您进行此项检查。

我看到有2个NUGET包源可以从中下载包(在Tools-&gt; Nuget Package Manager-&gt; Packager Manager设置中)。其中一个Package Source没有运行,Nuget只是试图从该源下载。

一旦我将包源更改为从https://www.nuget.org/api/v2/在设置中显式

进行下载,事情便落到了位置

答案 18 :(得分:0)

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

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

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

  3.   <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>
    

答案 19 :(得分:0)

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

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

  1. 备份一切。请注意您需要重新安装的依赖项列表,退出VisualStudio
  2. 在文本编辑器中打开所有.proj文件,然后删除所有PackageReference
  3. 在每个项目中,删除binobj文件夹
  4. 删除您在解决方案中找到的所有“包”文件夹。
  5. 打开解决方案,进入Tools > Nuget Package Manager > Package Manager SettingsClear all Nuget caches。检查控制台,因为它可能 无法删除某些项目 - 复制文件夹路径并退出视觉 工作室。
  6. 从该文件夹中删除任何内容重新打开解决方案并启动 从头开始再次安装nuget包。
  7. 如果仍然无效,请重复,但也可以在Windows资源管理器中搜索nuget的驱动器,并删除任何缓存状态。

答案 20 :(得分:0)

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

打开后,键入(然后按Enter键)

dotnet restore

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