我正在尝试使用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文件。
包文件夹的相对路径是什么?
答案 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 ...
在文件底部,对相同的引用在“错误条件”条目中执行相同的操作:
答案 2 :(得分:1)
就我而言,我从GitHub下载了一个项目,该项目不包含完整的sln,而只是一个文件夹,其中.csproj和packages文件夹处于同一级别。
在这种情况下,我只需要在.csproj文件中将“ .. \ packages \”替换为“。\ packages \”即可。我认为GitHub存储库的所有者决定只上传项目文件夹,但是在上传之前没有重新编译进行测试...