.NET Core 3.1 Linux容器构建无法加载Microsoft.CodeAnalysis如何解决
CommonLib -> /srv/jenkins_work/DSS/ewcms/CMS/CommonLib/bin/release/netcoreapp3.1/CommonLib.dll
CSC : error CS8032: An instance of analyzer Microsoft.EntityFrameworkCore.InternalUsageDiagnosticAnalyzer cannot be created from /var/lib/jenkins/.nuget/packages/microsoft.entityframeworkcore.analyzers/5.0.9/analyzers/dotnet/cs/Microsoft.EntityFrameworkCore.Analyzers.dll : Could not load file or assembly 'Microsoft.CodeAnalysis, Version=3.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. The system cannot find the file specified.. [/srv/jenkins_work/DSS/ewcms/CMS/Microsoft.EntityFrameworkCore.UnitOfWork/Microsoft.EntityFrameworkCore.UnitOfWork.csproj]
问题根因
该报错的核心原因为:EF Core 5.0.9版本自带的代码分析器依赖Microsoft.CodeAnalysis 3.7.0版本,而Linux容器内安装的.NET Core 3.1 SDK自带的Roslyn(即Microsoft.CodeAnalysis)版本低于3.7.0,无法满足分析器的依赖要求,导致加载失败。
本地Visual Studio 2019可正常编译,是因为VS自带了更高版本的Microsoft.CodeAnalysis组件,符合分析器的依赖要求。
仅当前项目报错的原因
仅该项目抛出错误、其余项目仅触发警告,是因为该项目的csproj配置中开启了警告转错误的规则,常见触发配置有两类:
- csproj中配置了
<WarningsAsErrors>节点,且包含了CS8032错误码,或是直接将所有警告设为错误 - csproj中配置了
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>,所有警告都会升级为错误中断构建
其余项目未配置上述规则,因此分析器加载失败仅会抛出警告,不会中断构建流程。
无需安装Visual Studio的规避方案
可任选以下任意一种方案解决问题:
方案1:禁用EF Core分析器(最快生效)
如果不需要EF Core代码分析能力,可直接在报错项目的csproj文件中添加如下配置,关闭EF Core分析器加载:
<ItemGroup> <Analyzer Remove="@(Analyzer)" Condition="'%(Filename)' == 'Microsoft.EntityFrameworkCore.Analyzers'"/> </ItemGroup>
如果需要关闭所有.NET内置分析器,可添加如下配置:
<PropertyGroup> <EnableNETAnalyzers>false</EnableNETAnalyzers> <AnalysisLevel>none</AnalysisLevel> </PropertyGroup>
方案2:降级EF Core版本适配.NET Core 3.1
EF Core 3.1.x版本的分析器依赖的Microsoft.CodeAnalysis版本和.NET Core 3.1 SDK自带的版本完全匹配,将解决方案内所有EF Core相关NuGet包从5.0.9降级到3.1.x最新稳定版,即可解决依赖不匹配问题。
方案3:升级容器内SDK版本(无代码改动)
在容器中安装.NET 5及以上版本的SDK,高版本SDK自带的Microsoft.CodeAnalysis版本满足EF Core 5.0.9分析器的依赖要求,且.NET SDK向下兼容,可正常编译.NET Core 3.1的项目。
内容的提问来源于stack exchange,提问作者Paritosh

