.NET Core 3.1 项目的 SonarQube 分析失败
Failing SonarQube analysis on .NET Core 3.1 project
我 运行 sonarqube:latest
在我的开发机器本地的 Docker 容器中让一些东西工作。
我正在尝试分析在 .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 东西,但最终没有 C# 结果在 SonarQube 中。
知道我做错了什么吗?
更新
经过一些调试后归结为:
<Target Name="ChangeAliasesOfReactiveExtensions" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'System.Interactive.Async'">
<Aliases>ix</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
我们这样做是因为我们仍在使用早期的 Entity Framework 版本。
我假设我们收到错误是因为分析器偶然发现了重复的类型。
有什么方法可以配置 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
来重现此内容。
我可以使用更新 2 重现该问题。更改 Alias
对场景没有任何影响,只有 ErrorLog
有所不同。
如 .sonarqube\bin\targets\SonarQube.Integration.targets
所示:SonarScanner 设置 ErrorLog
以在分析结果为空时收集分析结果。当它被明确设置时,它不会拾取它。我不确定这是为什么。
要修复您的场景,请更新您的 Build.Directory.targets
文件以像这样设置声纳属性:
<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
我 运行 sonarqube:latest
在我的开发机器本地的 Docker 容器中让一些东西工作。
我正在尝试分析在 .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 东西,但最终没有 C# 结果在 SonarQube 中。
知道我做错了什么吗?
更新
经过一些调试后归结为:
<Target Name="ChangeAliasesOfReactiveExtensions" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'System.Interactive.Async'">
<Aliases>ix</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
我们这样做是因为我们仍在使用早期的 Entity Framework 版本。
我假设我们收到错误是因为分析器偶然发现了重复的类型。
有什么方法可以配置 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
来重现此内容。
我可以使用更新 2 重现该问题。更改 Alias
对场景没有任何影响,只有 ErrorLog
有所不同。
如 .sonarqube\bin\targets\SonarQube.Integration.targets
所示:SonarScanner 设置 ErrorLog
以在分析结果为空时收集分析结果。当它被明确设置时,它不会拾取它。我不确定这是为什么。
要修复您的场景,请更新您的 Build.Directory.targets
文件以像这样设置声纳属性:
<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