这个项目引用了在此计算机上缺失的 NuGet 包。

426

我有一个ASP.NET MVC5应用程序,昨天还可以使用,但现在在尝试构建时出现以下错误:

该项目引用了此计算机上缺失的NuGet包。

我已经选中了两个选项,允许NuGet自动下载和安装缺失的包。我也尝试过删除packages文件夹中的所有文件,然后让NuGet重新下载它们。另外,当我打开NuGet并查找更新时,它说没有需要安装的更新。我无法想到其他解决这个非常烦人问题的方法。

我也启用了NuGet恢复,通过右键单击项目并选择该选项。然后它添加了一个nuget文件夹和该文件夹中的三个项目,并且对于解决问题没有任何作用。我已经尝试重新构建,仍然得到相同的错误。


1
你的解决方案中是否包含.nuget文件夹,并且你是否已经更新了NuGet到最新版本?请参考这里:https://dev59.com/S2Mk5IYBdhLWcg3w8STa - David Brabant
是的,我尝试过了,但它并没有解决我的构建错误消息问题。 - Austin Harris
这个错误的另一个原因是在构建期间出现了“操作已超时”的错误。您需要检查构建日志或Visual Studio Online构建失败信息屏幕中的“诊断”选项卡。 - Joshua Drake
1
没有一个解决方案适用于我。我正在从存储库下载并还原软件包到第一个项目的正确文件结构中,但第二个项目找不到它们。检查 .csproj 文件显示使用了正确的相对路径,所以我无法解决这个问题。https://github.com/DanJ210/ProgrammersTest - Daniel Jackson
当我升级扩展版本时(右键单击项目,管理NuGet包,升级),我遇到了这个问题。Visual Studio忘记删除对旧版本的引用并添加了对新版本的引用。手动编辑项目文件并删除陈旧的引用(有两个!)是解决方法。 - jozxyqk
24个回答

594

在我的情况下,我需要从.csproj文件中删除以下内容:

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

事实上,从这个片段中可以看出错误信息的来源。

我正在从MSBuild-Integrated Package Restore转换为Automatic Package Restore (https://learn.microsoft.com/en-us/nuget/consume-packages/package-restore#migrate-to-automatic-package-restore)。


17
这对我起作用了,但我只需要移除<Target></Target>元素。如果我同时移除<Import>元素,VS[2013]似乎会将它恢复。 - Robert Taylor
14
这太不可思议了。为什么微软让所有事情都变得如此困难呢? - dimiguel
35
如果这个可以被移除,那么一开始为什么要放置它呢? - OK999
4
在某个时候,您一定曾经在早期版本的Visual Studio中通过右键单击解决方案并选择“启用NuGet包恢复”来启用它,以旧的方式完成操作。但现在我们不再需要这样做了。 - Loren Paulsen
2
通常情况下,当您更改项目目录名称或路径时,会出现此错误。编辑 .proj 文件并将新的目录名称或路径替换为恢复包。 - Kashif Saleem
显示剩余17条评论

121

一种解决方案是从.csproj文件中删除以下内容:

One solution would be to remove from the .csproj file the following:

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

如何操作?

  1. 右键点击项目。选择卸载项目。
  2. 右键点击项目。选择编辑 csproj 文件。
  3. 从文件中删除相应部分。保存文件。
  4. 右键点击项目。选择重新加载项目。

2
当您将项目从一个位置移动到另一个位置时,这非常好。 - Dean Seo
4
@ClintEastwood 我的回答解释了如何去做。这就是区别所在。如果用户想要一个如何去做的答案,我的回答已经给出了,与上面的回答相比有所不同。 - Ivan Santiago
7
你可以将它作为注释添加,或者编辑原始答案并加上“如何操作”的说明。 - Colin

71

我的情况是,在将解决方案文件夹从一个位置移动到另一个位置,对其进行了一些重新组织,并因此更改了其相对文件夹结构后发生了这种情况。

因此,我不得不编辑我的.csproj文件中类似以下条目的所有条目:

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

to
  <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

(注意从 ..\packages\packages\ 的更改。在您的情况下,相对结构可能不同,但您可以理解这个想法。)


4
类似的问题......我将.csproj文件移到目录结构中的上一级,因此必须将路径中的".. ..\packages..."更改为".. \packages..."。 - tmgirvin
3
我之前遇到了一个类似的问题,但是非常奇怪。我在一个子解决方案模块中使用它时,它可以正常工作,但是当我从另一个解决方案中引用该解决方案时,包的位置不同了。我将.csproj文件中的".. \ packages"改为"$(SolutionDir)packages",问题得到了解决。 - JoeNCA
3
如果您不想手动操作 .csproj 文件,我发现记录项目安装的所有 nuget 包,将其删除并重新安装可以解决此问题。当我尝试从一个解决方案中移除一个项目并将其放入自己的 git 存储库时,我遇到了这个问题。 - Ebsan
1
这是否意味着您的.csproj文件与.sln文件位于同一级别? - Simon_Weaver
1
@Simon_Weaver 在这种情况下,你的 .csproj 相对于你的 .sln 的位置并不重要。重要的是你的 .csproj 中引用的任何内容是否已经移动到其他地方。如果是这样,那么你需要进行修复。如果你将.csproj 连同其引用的所有内容一起移动,但保持 .sln 的位置不变,那么你需要将 .sln 文件修复到新的 .csproj 位置,但无需编辑 .csproj 文件。 - Nikita R.
这正是我的问题。遵循这个解决方案确实很有效。 - JosephDoggie

23

我通过右键单击我的解决方案, 然后点击启用NuGet软件包还原选项,轻松解决此问题。

(注意:确保您拥有从工具-->扩展和更新-->Visual Studio 2013的Nuget包管理器安装。如果没有,请先安装此扩展程序)

希望这能帮到您。


12
这是恢复 NuGet 包的旧方式,应该避免使用。 - The Muffin Man
4
@TheMuffinMan:请问你能否澄清一下新方法是什么,以及为什么应该避免使用这种方法(考虑到VS 2013错误输出会告诉你要这样做)? - CantrianBear
3
请导航至此页面 https://docs.nuget.org/consume/package-restore 并找到名为“MSBuild-Integrated Package Restore”的部分。那是旧的方式,并列出了一些使用新方式的原因。 - The Muffin Man
1
请见David Ebbo在其博客上的文章http://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html。现在,“NuGet现在总是在VS构建之前还原packages。” - timB33

20
在我的情况下,问题出在Microsoft.Build.Bcl版本上。我的NuGet包版本是1.0.21,但我的项目文件仍然指向版本1.0.14。
因此,我将我的.csproj文件从以下内容进行了更改:
  <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
   <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="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=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

至:

 <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="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=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />

而且构建又恢复正常了。


18

我有同样的问题。当我复制一个现有的项目并将其转移到我的解决方案目录文件夹中,并将其作为现有项目添加到我的空解决方案中时,我遇到了这个问题。所以我不得不编辑我的csproj文件,找到这行特定的代码,大多数情况下,这可以在最后几行找到:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

在那一行之后,我必须将这些注释掉:

  <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. 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\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" />
  </Target>
  <Import Project="..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" />

您的解决方案会提示您的项目发生了更改,只需选择重新加载所有内容:

在这里输入图片描述 然后在重新构建我的解决方案后,一切正常。


13

如果您正在使用TFS

请从解决方案的.nuget文件夹中删除NuGet.exeNuGet.targets文件。确保也将这些文件从解决方案工作区中删除。 保留NuGet.Config文件,以便继续绕过将软件包添加到源代码控制中。

编辑解决方案中的每个项目文件(例如 .csproj、.vbproj),并删除对NuGet.targets文件的任何引用。在所选编辑器中打开项目文件,并删除以下设置:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(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>

如果你没有使用TFS

从你的解决方案中删除.nuget文件夹。确保文件夹本身也从解决方案工作区中删除。

编辑解决方案中的每个项目文件(例如.csproj、.vbproj)并删除对NuGet.targets文件的任何引用。在所选编辑器中打开项目文件并删除以下设置:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(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>

参考:将基于 MSBuild 的解决方案迁移到自动包恢复


11

在.csproj文件中删除以下行

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

9

包是否被恢复到错误的文件夹中?检查csproj文件中的路径是否正确。

如果它们不同,可能是因为包现在被恢复到不同的位置。这可能是由于已经检入了一个包含类似以下内容的NuGet.Config文件导致的:

<add key="repositoryPath" value="..\..\Packages" />

正在恢复软件包,但项目仍然在查看旧位置。


1
我认为这可能是路径问题,因为我移动了文件的位置,但我没有看到任何硬编码路径的地方。我查看了proj文件,所有的packages文件似乎都是相对的,像这样:<Reference Include="Antlr3.Runtime,Version=3.5.0.2,Culture=neutral,PublicKeyToken=eb42632606e9261f,processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath> </Reference> - Austin Harris
将以下内容添加到web.config并没有起作用:<add key="repositoryPath" value="..\..\Packages" /> - Austin Harris
你不想将它添加到web.config文件中。我是在指NuGet.config文件,你需要检查相对路径。你的packages文件夹相对于csproj文件在哪里?它们在..\packages文件夹下吗?听起来包已经被正确还原,但你的项目正在寻找错误的位置。 - infojolt
我找不到 nuget.config 文件。 - Kashif Saleem

8

我曾经遇到过类似的问题。在我的情况下,安装 Microsoft.Bcl.Build 包解决了这个问题。


这对我也起作用了,但我不知道正确的做法是安装那个包(它与下面henkie14版本更改答案具有相同的效果),还是只删除所有这些目标 - 它们实际上是否有任何有用的作用? - Gaz
1.0.21 版本中,软件包中没有文件,安装 1.0.14 版本可以解决此问题。 - FLCL

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