.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>

或删除 ErrorLogRazorCompilationErrorLog 的显式值。 Json 报告将在这些路径中:

Roslyn: $(TargetDir)$(TargetFileName).RoslynCA.json
Razor: $(TargetDir)$(TargetName)$(RazorTargetNameSuffix)$(TargetExt).RoslynCA.json