.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 来重现这一点。

【问题讨论】:

嗨,你是如何构建你的项目的?您是否在扫描器beginend 步骤之间使用/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>

或删除ErrorLogRazorCompilationErrorLog 的显式值。 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.1 项目中使用 vb dll

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

从 .NET Core 2.1 迁移到 .NET Core 3.1 后,publish 有问题