NuGet软件包丢失


297

我搜索了这个问题,但是没有一个解决方案起作用。我已经安装了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. 我的解决方案中没有.nuget文件夹。
  2. 我在解决方案中有一个packages文件夹,当我删除它时,似乎NuGet确实重建了依赖关系,但项目仍然存在上述错误。
  3. 我尝试从TFS中删除该项目,但没有解决。
  4. 除上述错误外,项目中的所有引用均带有黄色警告标志,并表示它们已丢失。
  5. 当我检查该项目的NuGet软件包管理器时,所有“缺失”的项目旁边都有一个绿色的勾,其中包括Microsoft.Net.Compilers。
  6. 我尝试添加一个新的Web API / MVC项目,但它遇到了类似的问题,其中大多数引用(例如Owin)都带有黄色警告标志“丢失”。

由于新用户发布的答案质量低下,因此投票否决了这个问题。
ZF007

Answers:


265

我今天遇到了相同的错误(缺少完全相同的软件包)。我还创建了一个MVC + Web API项目。

发生这种情况是因为我将应用程序文件(包括.csproj)文件移动到了另一个位置。我手动更新了.sln文件,但所有软件包依赖关系现在(Visual Studio 2015)存储在.csproj文件中。

编辑.csproj文件并更正解决方案文件夹(包含packages文件夹)的相对路径,这对我来说解决了这个问题。


2
如果缺少,则在移动后将Microsoft.Net.Compilers ...文件夹从旧的包文件夹复制到新的包位置可能是最后一步。
贾斯汀·维尼亚尔

2
我刚刚从计算机上删除了那个ONE软件包,它可以正常工作。
SpoiledTechie.com

1
在物理上将项目移动到Visual Studio解决方案中的其他位置时,我也收到错误消息。此页面上的所有解决方案均无效,因此我制作了该项目的副本(在文件系统上),并完全删除了VS中对原始项目的所有引用。然后,我重新创建了项目,并将片段(从我制作的副本中)复制到了项目中。费力,但确实有效。
Andrew Jens

2
将项目从一个位置移动到另一个位置后,我也遇到了同样的问题。“ .csproj”文件中软件包的修复路径解决了该问题。
尼尔曼

2
@MiłoszWieczorek我尝试在程序包管理器控制台中运行命令,但无法解决问题。它重新加载了所有软件包,但是仍然找不到引用。
弗朗西斯科·德·安科尼亚·

360

我通过从.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

31
我可能是错的,但是我相信这是“用锤子扑灭苍蝇”。如果由于某种原因,发布的位置丢失了任何其他必需的nuget软件包,它将不会出错,从而给您带来误报(即,部署成功,但是系统失败)。不是粉丝,但我不会拒绝投票,因为我仍然不熟悉nuget的某些方面。
HeyZiko

4
这对我也有用。奇怪的是,错误消息已硬编码在proj文件本身中……
Ryan Peters

7
确认此问题在VS 2017中仍然存在。我将项目从Visual Studio 2015迁移到了2017,并在2017年首次编译时收到了此错误消息。此问题已得到修复。
汤姆·麦克唐纳

2
为什么这样做会删除功能,冒着破坏项目风险的风险?正如@HeyZiko指出的那样,这可能会在以后导致问题。我可以按照错误状态“启用程序包还原”进行操作。请在此页上的某处查看我的答案...
尼克

45

注意-这将更新整个解决方案的软件包,而不仅仅是项目。

如果您还有一个缺少的nuget软件包,则在构建解决方案时会出错,请使用以下命令,使用工具> Nuget软件包管理器>软件包管理器控制台中的Nuget命令控制台。它将重新安装所有当前软件包。

Update-Package –reinstall

更新:

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

Update-Package –reinstall -ProjectName SampleApp

1
这对我有用。在我通过一个系统上的git推送更改并将其拉到另一个系统上之后,错误对我突然弹出。也许我的.gitignore没有为nuget软件包正确配置。
Patrick Borkowicz

16
当心...这将更新整个解决方案的软件包,而不仅仅是项目。
SO用户

1
这对我有用。NuGet一直抱怨缺少软件包,但是Visual Studio无法自动解决。花费了几分钟才能完全运行,但是此命令解决了我的问题。
尼克·亚历山大

8
您可以添加-ProjectName参数,使其仅适用于特定项目,而不适用于整个解决方案。
米沃什维乔雷克

2
VS2017通过这一坠毁一半,它打破了一切

19

我收到了这个令人沮丧的确切消息。最终对我有用的是删除/ packages中的所有文件和文件夹,并让VS在下一版本中重新获取所有内容。


2
我在“解决方案”上单击鼠标右键Restore Nuget Packages
Vitor Canova

1
我DONOT有任何恢复NuGet包,当我用鼠标右键单击解决方案....我使用VS 2013 ..
Ziggler

还必须确保将其还原到正确的软件包。使用note / Edit * .csproj检查.csproj作为包文件夹的位置
AceMark '19

15

提比留是对的。由于文件移动并导致此问题,我不得不编辑.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 2016年

15

这样可以解决我的错误:在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 '19

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中出错?
保护者

8

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

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

  ----Error---

< /Target>

然后做了

Update-Package -Reinstall

从和它的工作。


6

对我来说,问题是当我将解决方案复制到新文件夹并打开它时,它缺少Nuget文件夹,如下所示。我复制了此文件夹,一切正常。注意:此文件夹位于我们的源代码管理中,但不在此解决方案项目中,它位于一个目录中。

在此处输入图片说明


6

只需启用NuGet软件包还原。右键单击您的解决方案>选择“启用NuGet软件包还原”。

右键单击您的解决方案>选择“启用NuGet软件包还原”

这将使用NuGet.Config文件创建.nuget文件夹并修复了我的问题。


谢谢!!我也遇到过类似的情况,“启用NuGet软件包还原”起作用了。
in那王子

18
对于我来说,它不是很安全,它说:“所有软件包都已安装,没有任何可恢复的内容。”
达利博尔

5

我正在使用VS2012,并且遇到相同的错误。我从.csproj文件中删除了以下Target标记,它开始编译而没有任何错误。

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  -- Error messages within Target Tag
</Target>

5

要扩展此处的一些答案,是的,您可以从.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项可以解决此问题。


2

对于任何在这里遇到我所遇到的问题的人(有些但不是所有软件包都已在构建服务器上还原),对我来说,最后的难题是在解决方案的根目录中添加NuGet.config,将其同级为.SLN。大卫·埃博(David Ebbo)在此处解释的文件:http ://blog.davidebbo.com/2014/01/the-right-way-to-restore-nuget-packages.html 。

在Ebbo的博客文章中,对我来说文件内容很简单

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </packageSources>
</configuration>

更新:

NuGet API URL已针对v3进行了更改(截至2016年9月)。从https://www.nuget.org/

<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />

1

该错误信息是完全正确的。我尝试了所有技巧,但都没有成功。该项目(简单的MVC Web App测试)从Windows 8.1 VS 2015社区移到了Windows 10上的新测试框中。VS 2015的所有最新更新都已应用。我什至无法安装任何较新版本的编译器软件包。

Loop:
<LOOP>This seems to be a Ground Hog Day phenomena.</LOOP>
GoTo Loop

我最终只是将Microsoft.Net.Compilers.1.0.0从旧项目复制到了新项目中,并且可以正常工作。然后,我可以开始将其他软件包更新为较新的版本。对我来说似乎是一个nuget项目升级过程的错误。

注意:原始项目是在VS 2015中创建的,没有任何传统的nuget方法。


1

适用于我的解决方案-Visual Studio 2015 Enterprice,项目.NET 4.6.1

  1. 升级到更新3
  2. 安装Web开发人员工具

Visual Studio安装向导


1

对我而言,程序包在正确的路径下,但程序包文件夹内的构建文件夹不在。我只是删除了它说缺少的所有软件包,然后重新构建了解决方案,并成功创建了构建文件夹和.props文件。因此错误消息是正确的,通知我某些东西未命中。


1

从Azure部署后,由于Azure中的构建失败,我遇到了这个问题。

原来我的.gitignore排除了中的build文件夹..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props

build文件夹强制提交给Git之后,问题就解决了。


1

我通过以下步骤解决了相同的问题

  1. <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="2.0.1" targetFramework="net46" />从package.config文件中删除了软件包。
  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,Microsoft.CodeDom.Providers.DotNetCompilerPlatform从package.config文件中删除更为重要。同样,在运行第3点中提到的命令后,该问题得以解决。删除了所有不需要的软件包,并更新了所需的软件包参考。

希望这对某人有帮助。


0

我找不到任何解决方案,因此将nuget.exe和powershell脚本的副本添加到了名为prebuild.ps1的解决方案的根目录中,内容如下。

$nugetexe = 'nuget.exe'
$args = 'restore SOLUTION_NAME_HERE.sln'
Start-Process $nugetexe -ArgumentList $args

我在构建前脚本路径中的构建中将此Powershell脚本称为 在此处输入图片说明


0

当我将packages文件夹以及解决方案文件和project文件夹一起复制时,我的工作正常。我只是没有从以前的位置复制包文件夹。


0

您也可以使用建议的错误消息作为提示。这是找到管理解决方案的软件包的方法,然后单击解决丢失的nuget软件包。

而已


0

在以下位置注释编译器选项WebConfig

<!--<system.codedom>
<compilers>
  <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
  <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>-->

更新软件包配置文件中软件包的最新版本

  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.4" targetFramework="net452" />

如果一切正常,则进行重建,无需继续,否则右键单击该项目,单击“卸载项目”,再次右键单击该项目并编辑.csproj文件

验证Codedom的路径,以前的路径中没有net45,手动添加,保存,加载,重建。它应该工作。

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

0

许多建议删除<Target>标签的标签可能使其可编译。但是,请注意在测试项目中使用它会产生副作用。

MSTest.TestAdapter编译时出现与nuget软件包相关的错误。通过删除<Target>标签解决了该问题。尽管它使构建成功,但测试方法却变得不可发现。测试资源管理器不会列出该项目中的测试方法,并且“运行测试”或“调试测试”也无法正常工作。

我在使用Visual Studio 2017和时遇到了此问题.Net framework 4.7,在其他版本中也可能会发生


1
我使用VS2017,.Net4.7和单元测试项目确实存在该问题。该项目已添加到多个解决方案中。自动还原有效,但是到错误的位置。替换为$(SolutionDir)工作,但更新失败。我在这里问。您找到任何解决方案了吗?
塞巴斯蒂安·舒曼

0

对我来说,问题是NuGet无法自动获取/更新软件包,因为完整的文件路径会太大。通过将解决方案移动到“文档”中的文件夹而不是深层嵌套的文件夹来解决

然后可以在解决方案上单击鼠标右键,然后选择“还原NuGet软件包”(如果只是构建并让它为您完成,则可能没有必要),然后选择“管理解决方案的NuGet软件包”以获取所有软件包。已更新为最新版本。

这是从Microsoft网站下载的示例ASP MVC应用程序的解决方案。


0

对于DevOps / Build工程师,您可以nuget restore针对受影响的SLN或针对缺少SLN的项目解决此问题。对于所有UWP项目的CI / CD构建,我都必须这样做。

  1. 确保在Visual Studio或独立版本的生成从属中都安装了nuget。如果是后者,请确保它在PATH中并跳过步骤2。
  2. 打开VS Dev CMD控制台,或通过已打开的控制台加载它,您可以按照以下说明进行操作:
    VS2015 call "%VS140COMNTOOLS%VsDevCmd.bat"

    VS2017call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\VsDevCmd.bat"
  3. call nuget restore MyStuff.SLN或者call nuget restore MyStuff.csproj没有SLN。

0

不知道这是否对任何人都有帮助,但是当我从本地计算机删除源代码而不将解决方案文件保存到TFS时出现了这个问题。(在最初的开发过程中,我右键单击并在解决方案资源管理器中签入了项目,但是忘记了签入解决方案本身。)当我需要再次进行此工作时,我在TFS中拥有的只是.csproj文件,没有.sln文件。因此,在VS中,我做了一个文件->源代码控制->高级-从服务器打开并打开了.csproj文件。从那里我做了一个全部保存,它询问我要将.sln文件保存在哪里。我将这个.sln文件与其他文件夹(App_Data,App_Start等)保存到项目目录中,而不是顶层目录中。我终于发现,我需要将.sln文件保存在项目文件夹的目录中,以便 与项目文件夹位于同一级别。我所有的路径都解决了,我得以再次构建它。


0

对我来说,我的gitignore文件忽略了我的packages文件夹。以下gitignore行引起了该问题-

**/packages/*

删除并恢复了我的包文件夹。希望这对其他人有帮助。


0

我已解决此错误,实际上我的包文件夹中有MSTest.TestAdapter(1.3.2)的另一个版本,.csproj文件中的引用指向MSTest.TestAdapter(1.1.0)。我已将所有MSTest.TestAdapter(1.1.0)替换为MSTest.TestAdapter(1.3.2),这解决了我的问题。


0

我知道这个问题很旧,但是今天我遇到了同样的情况,想为最近发现此问题的任何人支付2美分。我手动将ASP MVC项目移至解决方案的子文件夹中,然后使用Visual Studio 2017将其删除并重新读入解决方案,出现了上述错误。将“ lib”和“ packages”文件夹移到与MVC项目相同的子文件夹的根目录中,解决了我的问题。


0

我遇到了同样的问题,原来我所引用的项目之一在解决方案目录之外(因此没有共享相同的“ / packages”文件夹)。对我有用的解决方案是打开参考项目的解决方案并在其中构建它。一旦该项目建立,错误就消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.