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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Visual Studio Express 2012升级nuget
[Visual Studio] 记一次排错:打不开 Nuget 包管理器里的安装package页面,无法 安装 / 恢复 包