Nuget无法还原Microsoft.Net.Compilers.1.0.0。

16
我正在尝试使用Nuget Package Manager在VS 2017中安装/恢复Microsoft.Net.Compilers.1.0.0。输出显示已完成还原。但是,当我检查packages文件夹时,我没有看到Microsoft.Net.Compilers文件夹。因此,我遇到了错误。
在csproj文件中,顶部有一行。
严重程度代码描述项目文件行抑制状态 错误此项目引用了在此计算机上缺失的NuGet包。使用NuGet Package Restore下载它们。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是....\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props。XXXXX \ Src \ Api \ Api.csproj 296
<Import Project="..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />

背景
这个问题出现在目标框架为4.6.2的Web API项目中。我还有一个NET Standard 1.4库,想与不同类型的.NET应用程序共享。当我将NET Standard Library的引用添加到Web API项目中时,我遇到了缺少依赖项问题。所以根据建议,我编辑了.csproj文件并添加了

  <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

这解决了缺少依赖项的问题。

然后我删除了package.config文件,从packages文件夹中删除了所有包,并重新添加了所有包(除了Microsoft.Net.Compilers)。现在,包引用在.csproj文件中。

这里有SO帖子,但在我的情况下,Microsoft.Net.Compilers甚至没有被还原到packages文件夹中。VS 2017显示还原完成,但我不知道它实际上将文件复制到哪里。(除非文件夹名称与Microsoft.Net.Compilers不同)

我的原始package.config文件有这一行:

<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net462" developmentDependency="true" />

现在在.csproj文件中我有:
   <PackageReference Include="Microsoft.Net.Compilers">
      <Version>1.0.0</Version>
    </PackageReference>

更新1
看起来当启用packagereference时,NuGet会将包安装在C:\ Users \ {username} \ .nuget \ packages 文件夹中。

这意味着我需要使用正确的相对路径更新csproj文件。

这里的packages文件夹的相对路径是什么?


由于我在使用这个NuGet时遇到了问题,所以我刚刚从项目文件中将其删除,现在它可以编译了。 - subrob sugrobych
3个回答

16

由于将包管理格式设置为PackageReference会将软件包安装到全局nuger文件夹中,即C:\ Users \ {username} \ .nuget \ packages ,因此我不得不编辑csproj文件并更新以下行:

csproj文件顶部

<Import Project="$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
  <Import Project="$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props')" />

然后更新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('$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props'))" />
    <Error Condition="!Exists('$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '$(UserProfile)\.nuget\packages\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
  </Target>

所有这一切只是为了将 NET Standard 1.4 项目引用到 .NET 4.6.2 中。非常烦人!


1
实际上有变量可以引用此包位置。请查看 obj\projectName.csproj.nuget.g.props - GGirard

5
@LP13的回答让我找对了方向,虽然我必须要做一些不同的事情。
我的.csproj文件中有两个Microsoft.Net.Compliers的引用。一个是2.9.0版本(我正在使用的当前版本),另一个是1.2.1版本(旧版本)。
在文件顶部,我注释掉了两个Import Project行,分别是:
  • Import Project=".\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1 ...

  • Import Project=".\packages\Microsoft.Net.Compilers.1.2.1 ...

在文件底部,针对同样的引用,在Error Condition条目中也要进行相同的操作:
  • Error Condition="!Exists('.\packages\Microsoft.Net.Compilers.1.2.1...
  • Error Condition="!Exists('.\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1' ...

这太完美了,希望我几年后再次遇到时能记得! - Jeff Patton

3
在我的情况下,我从GitHub下载了一个项目,该项目不包括完整的sln,而只是一个包含.csproj和packages文件夹的单个文件夹。
在这种情况下,我只需要在.csproj文件中将".. \ packages \"替换为".\ packages \"即可。我认为GitHub仓库的所有者决定只上传项目文件夹,但在上传之前没有重新编译进行测试...也许?

我不得不在.csproj文件中将它从..\..\packages\更改为..\packages\才能使其正常工作。 - RBT
这个选项对我没有用,但上面Jeff的答案解决了问题。 - Jeff Patton

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