NuGet包丢失

340

我搜索了这个问题但是没有一个解决方案有效。我安装了Visual Studio Professional 2015并且正在使用TFS,我的NuGet版本是3.1.6。这个问题只出现在我的C# Web API/MVC项目中。

我遇到以下错误:

此项目引用缺失于此计算机上的 NuGet 包。请使用 NuGet 包恢复下载它们。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105。缺失的文件为..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props

  1. 我没有.sln中的.nuget文件夹。
  2. 我在解决方案中有一个名为“packages”的文件夹,当我删除它时,似乎NuGet确实会重新构建依赖项,但是项目仍然会出现上述错误。
  3. 我尝试将项目从TFS中删除,但这并没有解决问题。
  4. 除了上述错误之外,项目中的所有引用都有黄色警告标志,并显示它们缺失。
  5. 当我检查该项目的NuGet包管理器时,“缺失”的所有东西都有绿色勾号,包括Microsoft.Net.Compilers。
  6. 我尝试添加一个新的Web API/MVC项目,它面临着类似的问题,其中大多数引用(如Owin)都有黄色警告标志。
38个回答

389

我通过从.csproj文件中删除这段代码来解决了我的问题:

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

5
接受的答案行不通,因为我在多个不同的解决方案中引用这个项目。这是唯一的解决方法。将其注释掉后,它就能正常工作了。 - Levi Fuller
38
我可能错了,但我认为这就是“以大欺小”。如果由于某种原因,发布的位置失去任何其他所需的NuGet软件包,它将不会出错,给你一个错误的结果(即部署成功,但系统失败)。我不是粉丝,但我不会投反对票,因为我仍然不熟悉NuGet的某些方面。 - HeyZiko
8
确认此问题在VS 2017仍然存在。我将一个项目从Visual Studio 2015迁移到了2017,在第一次编译时就收到了这个错误信息。这个方法解决了这个bug。 - Tom McDonald
2
为什么要删除功能,冒着项目崩溃的风险去做这个呢?正如@HeyZiko指出的那样,这可能会导致以后的问题。我可以按照错误提示的方式“启用软件包还原”。在本页面的某个地方看到我的答案... - Nicow
3
这可能是“杀鸡焉用牛刀”,但在我的情况下,我的项目没有任何nuget包(不过解决方案中的另一个项目有,但是那个项目编译正常),而且“启用包恢复”的选项实际上已经被勾选了。 - CodeHxr
显示剩余9条评论

303

今天我也创建了一个MVC + Web API项目,然后遇到了同样的错误(缺少完全相同的包)。这是因为我将应用程序文件(包括.csproj)移动到另一个位置。我手动更新了.sln文件,但现在(在Visual Studio 2015中)所有软件包依赖关系都存储在.csproj文件中。

编辑.csproj文件并将相对路径正确更正至包含packages文件夹的解决方案文件夹可以解决我的问题。


3
如果在移动后发现缺少Microsoft.Net.Compilers文件夹,将其从旧的packages文件夹复制到新的packages位置可能是必须的最后一步。 - Justin Wignall
3
我只是从我的电脑中移除了那个软件包,然后它就可以工作了。 - SpoiledTechie.com
1
当我将项目实际移动到Visual Studio解决方案中的其他位置时,我也遇到了这个错误。此页面上的任何解决方案都没有起作用,因此我在文件系统上复制了该项目,并完全删除了VS中对原始项目的所有引用。然后我重新创建了项目,并从我制作的副本中复制了一些部分。虽然费力,但它确实起作用了。 - Andrew Jens
2
将项目从一个位置移动到另一个位置后,我也遇到了同样的问题。在“.csproj”文件中修复软件包路径解决了这个问题。 - Nirman
2
@MiłoszWieczorek 我尝试在包管理器控制台中运行命令,但它并没有解决问题。它重新加载了所有的包,但是引用仍然找不到。 - Francisco d'Anconia
显示剩余6条评论

51

注意 - 此操作将更新整个解决方案的包,而不仅仅是项目。

如果你在构建解决方案时遇到了一个或多个缺失的NuGet包并出现错误,请使用NuGet命令控制台中的以下命令。在“工具”>“NuGet程序包管理器”>“程序包管理器控制台”中执行此命令会重新安装所有当前的包。

Update-Package –reinstall

更新:

您可以将特定的项目名称作为参数传递。

Update-Package –reinstall -ProjectName SampleApp

2
这对我有用。在一个系统上通过git推送更改并在另一个系统上拉取它们后,错误出现了。也许我的.gitignore没有正确配置nuget包。 - Patrick Borkowicz
18
注意...这将更新整个解决方案的软件包,而不仅仅是项目。 - Rashmi Pandit
2
这对我有用。NuGet一直抱怨缺少包,但Visual Studio无法自动解决。它花了几分钟才完全运行,但这个命令解决了我的问题。 - Nick Alexander
9
您可以添加“-ProjectName”参数,使其仅适用于特定项目,而不是整个解决方案。 - Miłosz Wieczorek
4
VS2017 在进行到一半时崩溃了,导致一切都出现问题。 - rollsch
显示剩余3条评论

24

这种方法解决了我的错误:

在Visual Studio 2015+解决方案资源管理器中打开.csproj文件进行更新的方式:

右击项目名称->取消加载项目

右击项目名称->编辑.csproj

删除以下行:

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use 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('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props'))" />
    <Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
    <Error Condition="!Exists('packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props'))" />
    <Error Condition="!Exists('packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
  </Target>

右键点击项目名称 -> 重新加载项目

最后构建您的解决方案。


在手动修复了csproj中的路径后,我删除了EnsureNuGetPackageBuildImports部分,然后它完美地工作了。谢谢。 - willyMon
对我有用。有点过度杀伤,但其他选项都没有解决问题。 - ssmith
这些条件是检查包在两个地方是否存在(有点奇怪,一个足够了)。删除它们的更好替代方案是修复路径,指向实际的包文件夹。它是相对的。您的包文件夹可能是..\..\packages..\..\..\packages或类似的。 - CervEd

21

我遇到过完全相同的令人沮丧的信息。最终对我有用的是删除 /packages 目录下的所有文件和文件夹,然后让 VS 在下一次构建时重新获取所有内容。


3
我在“解决方案”上右键点击,选择“还原Nuget包”。 - Vitor Canova
4
当我右键点击解决方案时,没有任何还原 Nuget 包的选项......我正在使用 VS 2013。 - Ziggler
1
还必须确保它恢复到正确的包。使用Note/Edit *.csproj检查.csproj以查找包文件夹的位置。 - AceMark

17

Tiberiu是正确的。由于文件被移动导致了这个问题,我不得不编辑我的.csproj文件。

 <Import Project="..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />

我在文件顶部和底部进行了更改

<Error Condition="!Exists('..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />

最终对我起作用的是仅编辑文件末尾的那一行,而不是顶部的那一行。 - ISAE

11

我通过从.csproj文件中删除以下代码解决了这个问题

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
  <ErrorText>This project references NuGet package(s) that are missing on this computer. Use 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('..\..\..\Assemblies\NuGet\SpecFlow.Plus.Excel.1.4.2\build\SpecFlow.Plus.Excel.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\Assemblies\NuGet\SpecFlow.Plus.Excel.1.4.2\build\SpecFlow.Plus.Excel.targets'))" />


1
但为什么首先会出现这些错误?是 Visual Studio 的 Bug 吗? - Protector one

9

两个回答的结合对我有帮助。首先,我修改了.csproj文件,删除了对1.0.0版本的引用。

< Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild" >

  ----Error---

< /Target>

然后执行了。
Update-Package -Reinstall

来自 且它起作用了。


8
我通过以下步骤解决了相同的问题:
  1. 从 package.config 文件中删除包 <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.1" targetFramework="net46" />
  2. 编辑.csproj 项目文件并删除以下设置。 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">     <PropertyGroup>       <ErrorText>This project references NuGet package(s) that are missing on this computer. Use 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('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />   </Target>

    1. 进入包管理器控制台并运行命令 Update-Package –reinstall

#2 和#3 点是其他用户提供的,我很感激这些用户。#1点,从 package.config 文件中删除 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 更为重要。此外,在运行 #3 点中提到的命令后,问题得到解决。所有不必要的包都被删除了,并更新了所需的包引用。

希望这能帮助某些人。


7

就一些答案进行更详细的说明,是的,您可以从.csproj文件中删除以下块:

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

这样可以解决问题,但在我的情况下,我注意到我有额外的参考.NET.Compilers和.CodeDom.Providers,并且它们具有不同的版本:

<Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.1.0.0
<Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\

<Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.2.0.1
<Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\

当我的packages.config只引用了以下内容:
<package id="Microsoft.Net.Compilers" version="2.0.1"
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.3"

从.csproj文件中删除1.0.0项即可解决该问题。

当出现流氓错误条件引用3.5.0而已经更新到3.7.0时,这也适用。 - Andrew Morton

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