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

时间:2018-02-12 19:48:52

标签: visual-studio-2017 nuget nuget-package .net-standard nuget-package-restore

我正在尝试使用Nuget Package Manager在VS 2017中安装/重新发送Microsoft.Net.Compilers.1.0.0。在输出中,它显示恢复已完成。但是,当我检查packages文件夹时,我看不到Microsoft.Net.Compilers个文件夹。 并且因为我得到了错误

  

严重级代码描述项目文件行抑制状态   错误此项目引用了缺少的NuGet包   这台电脑。使用NuGet Package Restore下载它们。更多   信息,请参阅http://go.microsoft.com/fwlink/?LinkID=322105。该   遗失的文件是   .... \包\ Microsoft.Net.Compilers.1.0.0 \建立\ 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应用程序共享。当我向Web API项目添加NET Standard Library的引用时,我得到了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
所以看起来当启用packagereference时,nuget将在C:\Users\{username}\.nuget\packages文件夹

安装软件包

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

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

3 个答案:

答案 0 :(得分:7)

由于将包管理格式设置为PackageReference,因此将包安装到C:\Users\{username}\.nuget\packages的全局nuger文件夹,我必须编辑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 :(得分:1)

@ 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'...

答案 2 :(得分:1)

就我而言,我从GitHub下载了一个项目,该项目不包含完整的sln,而只是一个文件夹,其中.csproj和packages文件夹处于同一级别。

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