Nuget 无法恢复 Microsoft.Net.Compilers.1.0.0

Nuget cannot restore Microsoft.Net.Compilers.1.0.0

我正在尝试 install/restrore Microsoft.Net.Compilers.1.0.0 在 VS 2017 中使用 Nuget 包管理器。在输出中它显示恢复完成。但是,当我检查 packages 文件夹时,我没有看到 Microsoft.Net.Compilers 文件夹。 因为那个我得到错误

Severity Code Description Project File Line Suppression State Error 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 ....\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. XXXXX\Src\Api\Api.csproj 296

在 csproj 文件中,顶部有一行

<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 项目时,我得到了 missing dependencies issues。因此,根据建议,我编辑了 .csproj 文件并添加了

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

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

然后我删除了 package.config 文件,从 packages 文件夹中删除了所有包并添加回所有包(除了我无法添加 Microsoft.Net.Compilers)。包参考现在位于 .csproj 文件中

这里有 post,但是在我的情况下 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 文件夹的相对路径是什么?

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

csproj 顶部

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

所有这些只是为了将 NET Standard 1.4 项目引用到 .NET 4.6.2 中。很烦!!

@LP13 的回答让我找到了正确的方向。虽然我不得不做一些不同的事情。

我的 .csproj 文件有 2 个对 Microsoft.Net.Compliers 的引用。一个用于 2.9.0(我正在使用的当前版本)和 1.2.1(旧版本)。

在文件的顶部,我注释掉了引用的 2 个导入项目行:

  • 导入项目=".\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1 ...

  • 导入项目=".\packages\Microsoft.Net.Compilers.1.2.1 ...

在文件底部,在错误条件条目中对相同的引用执行相同的操作:

  • 错误条件="!Exists('.\packages\Microsoft.Net.Compilers.1.2.1...
  • 错误条件="!Exists('.\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1' ...

在我的例子中,我从 GitHub 下载了一个项目,该项目不包含完整的 sln,但只是一个文件夹,其中包含 .csproj 和 packages 文件夹在同一级别。

在这种情况下,我只需将 .csproj 文件中的“..\packages\”替换为“.\packages\”。我假设 GitHub 存储库的所有者决定只上传项目文件夹,但在上传之前没有重新编译测试...也许?