.NET Core 3.1 项目的 SonarQube 分析失败
Posted
技术标签:
【中文标题】.NET Core 3.1 项目的 SonarQube 分析失败【英文标题】:Failing SonarQube analysis on .NET Core 3.1 project 【发布时间】:2021-07-19 14:22:51 【问题描述】:我在我的开发机器上的本地 Docker 容器中运行 sonarqube:latest
以使某些东西正常工作。
我正在尝试分析一个在 .NET Core 3.1 上运行的 C# 项目。看着this page,我以为我可以使用 .NET Core 全局工具对其进行扫描,但在运行结束步骤时会出现以下错误:
警告:您的项目包含无法使用您正在使用的扫描仪进行分析的 C# 文件。要分析 C# 或 VB.NET,您必须使用适用于 .NET 5.x 或更高版本的 SonarScanner,请参阅https://redirect.sonarsource.com/doc/install-configure-scanner-msbuild.html
当我尝试使用 .NET 5 dotnet <path to SonarScanner.MSBuild.dll>
等时也会发生这种情况。它可以很好地扫描我项目中的所有 TypeScript 和 CSS 内容,但最终在 SonarQube 中没有 C# 结果。
知道我做错了什么吗?
更新
在做了一些调试之后,它归结为:
<Target Name="ChangeAliasesOfReactiveExtensions" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'System.Interactive.Async'">
<Aliases>ix</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
我们这样做是因为我们仍在使用早期的实体框架版本。
我假设我们收到错误是因为分析器偶然发现了重复的类型。
有什么方法可以配置 SonarQube,所以这不是问题吗?
更新 2
显然导致所有问题的文件是Directory.Build.targets
:
<Project>
<Target Name="ChangeAliasesOfReactiveExtensions" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'System.Interactive.Async'">
<Aliases>ix</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
<PropertyGroup Condition=" '$(IntermediateOutputPath)' != '' ">
<ErrorLog>$(IntermediateOutputPath)\csc_diagnostics.json</ErrorLog>
<RazorCompilationErrorLog>$(IntermediateOutputPath)\csc_razor_diagnostics.json</RazorCompilationErrorLog>
</PropertyGroup>
</Project>
注释掉此文件的内容或将其删除可修复 SonarQube 分析警告并在 SonarQube 中显示 C# 文件。
我可以通过创建一个新的 C# 项目 (dotnet new console
) 并使用上述内容创建一个文件 Directory.Build.targets
来重现这一点。
【问题讨论】:
嗨,你是如何构建你的项目的?您是否在扫描器begin
和end
步骤之间使用/t:Rebuild
目标构建它?
我运行dotnet build
。尝试添加 /t:Rebuild
但仍然是相同的错误消息。
我尝试在为 .NET Core 3.1 配置的全新控制台应用程序上运行扫描程序,并且可以正常工作。所以这是我的项目导致它失败的原因,但我不知道如何调试它。
RunAnalyzersDuringBuild=true
很好。 false
需要最新的扫描仪 5.2,但我假设你有那个
我尝试了Aliases
目标,它并没有破坏分析。如上所述,使用/v:d
构建并检查csc.exe
参数是接下来要做的事情。
【参考方案1】:
我可以通过更新 2 重现该问题。更改 Alias
不会对场景产生任何影响,只有 ErrorLog
会有所不同。
如.sonarqube\bin\targets\SonarQube.Integration.targets
中所见:SonarScanner 设置ErrorLog
以在其为空时收集分析结果。并且当它被明确设置时它不会被选中。我不确定这是为什么。
要修复您的场景,请更新您的 Build.Directory.targets
文件以设置 Sonar 属性,如下所示:
<PropertyGroup Condition=" '$(IntermediateOutputPath)' != '' ">
<ErrorLog>$(IntermediateOutputPath)\csc_diagnostics.json</ErrorLog>
<RazorCompilationErrorLog>$(IntermediateOutputPath)\csc_razor_diagnostics.json</RazorCompilationErrorLog>
<SonarCompileErrorLog>$(ErrorLog)</SonarCompileErrorLog>
<RazorSonarCompileErrorLog>$(RazorCompilationErrorLog)</RazorSonarCompileErrorLog>
</PropertyGroup>
或删除ErrorLog
和RazorCompilationErrorLog
的显式值。 Json 报告将位于以下路径:
Roslyn: $(TargetDir)$(TargetFileName).RoslynCA.json
Razor: $(TargetDir)$(TargetName)$(RazorTargetNameSuffix)$(TargetExt).RoslynCA.json
【讨论】:
我觉得奇怪的是 Alias 对您的扫描没有任何影响。如果我启用它,我会收到上述错误。感谢您在错误日志中的见解!以上是关于.NET Core 3.1 项目的 SonarQube 分析失败的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 3.1 项目的 SonarQube 分析失败
.NET Core 3.0或3.1 类库项目中引用 Microsoft.AspNetCore.App
ASP.NET Core api 项目 3.1 在 IIS 上发布
NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)