SonarQube扫描多C#项目sonar.inclusions失效及扫描缓慢问题求助
问题背景
使用SonarQube Community Edition 8.9.10 + Sonar Scanner for MSBuild 5.13.0.66756-net5.0,扫描包含多个C#项目的单.sln文件夹:
- 正常编译(
dotnet clean后)耗时约12秒 - SonarQube扫描时构建耗时超1分钟,无变更项目也被扫描
- 尝试用
sonar.inclusions过滤文件,但未被包含的项目(如monocromo.example.API.slmp.csproj)仍被处理,所有项目均被重新编译
扫描命令如下:
dotnet sonar-scanner-msbuild-5.13.0.66756-net5.0/SonarScanner.MSBuild.dll begin /k:"project_key" /d:sonar.token="token" /v:1 dotnet build solution.sln dotnet sonar-scanner-msbuild-5.13.0.66756-net5.0/SonarScanner.MSBuild.dll end /d:sonar.token="token"
问题解答
1. 为何未包含的项目仍被扫描?
sonar.inclusions是文件级过滤规则,仅控制哪些代码文件会被上传到SonarQube服务器进行分析,不会阻止MSBuild扫描器处理整个解决方案中的项目。
SonarScanner for MSBuild在begin阶段会解析整个解决方案的所有项目,获取项目结构、依赖等信息,即使你设置了文件过滤,这些项目依然会被编译——扫描器需要通过编译过程收集代码的编译信息,只是最终不会把未包含的文件的分析结果上传。
2. 如何加快扫描速度?
(1)使用项目级排除参数sonar.msbuild.excludeProject
这是SonarScanner for MSBuild特有的参数,直接排除整个项目,被排除的项目不会被扫描器处理,也不会被编译,能大幅减少耗时。
在begin命令中添加该参数:
dotnet sonar-scanner-msbuild-5.13.0.66756-net5.0/SonarScanner.MSBuild.dll begin /k:"project_key" /d:sonar.token="token" /v:1 /d:sonar.msbuild.excludeProject="**/monocromo.example.API.slmp.csproj"
排除多个项目用分号分隔:
/d:sonar.msbuild.excludeProject="**/proj1.csproj;**/proj2.csproj"
(2)启用增量扫描
SonarQube 8.9+支持增量扫描,仅扫描有变更的文件和项目,避免重复处理无变更内容。在begin命令中添加:
/d:sonar.incremental=true
注意:不要每次扫描前都执行dotnet clean,否则会丢失MSBuild的增量构建信息,导致增量扫描失效。如果必须清理,仅清理目标项目的输出目录,而非整个解决方案。
(3)优化构建命令
- 若已提前执行过
dotnet restore,在dotnet build时添加--no-restore参数,跳过还原步骤:dotnet build solution.sln --no-restore - 避免不必要的
dotnet clean,依赖MSBuild的增量构建特性减少重复编译。
(4)精准设置文件级过滤(可选)
如果需要更细粒度的文件过滤,确保sonar.inclusions规则精准匹配目标文件,例如仅包含特定项目下的C#文件:
/d:sonar.inclusions="**/src/TargetProject1/**/*.cs;**/src/TargetProject2/**/*.cs"
注意:该参数仅减少上传到SonarQube的文件数量,无法减少编译耗时,优先用项目级排除优化编译速度。
内容的提问来源于stack exchange,提问作者FarsoFracico

