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

Posted

技术标签:

【中文标题】Nuget 无法恢复 Microsoft.Net.Compilers.1.0.0【英文标题】:Nuget cannot restore Microsoft.Net.Compilers.1.0.0 【发布时间】:2018-02-12 19:48:51 【问题描述】:

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

严重性代码描述项目文件行抑制状态 错误此项目引用了缺少的 NuGet 包 这台电脑。使用 NuGet 包还原下载它们。更多 信息,请参阅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

在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 文件中

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 所以看起来当启用包引用时,nuget 会将包安装在C:\Users\username\.nuget\packages 文件夹中

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

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

【问题讨论】:

因为我在使用这个 nuget 时遇到了问题,所以我刚刚从项目文件中删除了它,现在它可以编译了。 【参考方案1】:

由于将包管理格式设置为 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 中。好烦!!

【讨论】:

实际上有变量可以引用这个包位置。看看obj\projectName.csproj.nuget.g.props【参考方案2】:

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

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

在文件顶部,我注释掉了引用的 2 个 Import Project 行:

Import Project=".\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' ...

【讨论】:

【参考方案3】:

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

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

【讨论】:

我必须在 .csproj 文件中将其从 ..\..\packages\ 更改为 ..\packages\ 才能正常工作。

以上是关于Nuget 无法恢复 Microsoft.Net.Compilers.1.0.0的主要内容,如果未能解决你的问题,请参考以下文章

TFS内部部署无法从私有源恢复nuget包

如何使用Visual Studio Express 2012升级nuget

新手:如何恢复nuget包?

[Visual Studio] 记一次排错:打不开 Nuget 包管理器里的安装package页面,无法 安装 / 恢复 包

Azure Function 1.x和VS17的Nuget问题

反向 NuGet 查找