Sonarqube 允许通过在 sonar.coverage.exclusions 键中添加模式来将单个文件从代码覆盖率中排除。这可以在项目级别上完成,方法是将它们添加到 UI 中,甚至通过指定 SonarQubeSetting 元素添加到 .csproj 文件中。即
<SonarQubeSetting Include="sonar.coverage.exclusions">
<Value>**/*.cs</Value>
</SonarQubeSetting>
然而,这两种方法似乎都不起作用。按照 SonarQube documentation 中指定的方式使用模式无法提供所需的结果。我也知道 SonarQubeExclude MSBuild 属性的存在,但我不想走这条路,因为它会将我的项目排除在所有其他分析之外。
我还缺少另一种可能性吗?或者根本不可能从代码覆盖率中排除项目中的所有类?
总结上面提到的答案,并补充一点。
要从 csproj 的 SonarQube 分析中排除项目,我们可以通过在该项目的 .csproj 中添加以下代码来实现
<PropertyGroup>
<!-- Exclude the project from analysis -->
<SonarQubeExclude>true</SonarQubeExclude>
</PropertyGroup>
从项目中排除文件
<ItemGroup>
<SonarQubeSetting Include="sonar.coverage.exclusions">
<Value>**/FileName.cs</Value>
</SonarQubeSetting>
</ItemGroup>
对于多个文件
<ItemGroup>
<SonarQubeSetting Include="sonar.coverage.exclusions">
<Value>**/FileName1.cs, **/FileName2.cs</Value>
</SonarQubeSetting>
</ItemGroup>
也可以参考这里使用的正则表达式模式
<PropertyGroup>
<!-- Exclude the project from analysis -->
<SonarQubeExclude>true</SonarQubeExclude>
</PropertyGroup>
在 .csproj 文件中排除整个项目而不是单个文件,或依赖 sonarqube 过滤器。
.NET 解决方案是 SonarQube 的项目。 .NET 解决方案的项目是 SonarQube 项目的模块。
特定的SonarQube MsBuild分析器将找到所有csproj/vbproj。 对于每个 .NET 项目,分析器都会应用 SonarQube 的项目设置。
如果您的存储库是:
MyApp.sln
MyApp.Shell\
MyApp.Shell.csproj
Windows\MainWindows.cs
MyApp.Core\
MyApp.Core.csproj
FooService.cs
要忽略 MyApp.Shell 项目上的代码覆盖率,您将直观地添加设置sonar.coverage.exclusions=MyApp.Shell\*
。 但MsBuild分析器单独分析每个.NET项目,根目录直接位于csproj/vbproj目录。 当分析 MyApp.Shell.csproj 时,忽略模式
MyApp.Shell\*
应用于
Windows\MainWindows.cs
。要从代码覆盖率中排除特定项目,我们需要在 SonarQube 的模块(.NET 项目)级别应用此设置。 我找到了两种解决方案。
1)在csproj中添加属性“sonar.coverage.exclusions”
在您的.csproj 中,添加:<.NET project>
<Project ...>
...
<ItemGroup>
<SonarQubeSetting Include="sonar.coverage.exclusions">
<Value>**</Value>
</SonarQubeSetting>
</ItemGroup>
...
</Project>
2) 配置 Web UI Sonarqube 的排除
从更新到 SonarQube 8.*,我无法检索 IHM 中的选项。来自:
SonarQube MSBuild Scanner 不会从分析中排除文件
<ItemGroup>
<Compile Update="ClassToExclude.cs">
<!-- Exclude the file from analysis -->
<SonarQubeExclude>true</SonarQubeExclude>
</Compile>
</ItemGroup>
在解决方案目录中设置一个
Directory.Build.props 文件,其中包含以下内容:
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<!-- This target customises the SonarQube MSBuild runner targets to limit the projects that are analysed.
Projects whose full path and file name match the specified filter will be marked as "excluded".
Note that this targets file does not ever set $(SonarQubeExclude) to "false". This is to allow other
targets to exclude projects for other reasons (e.g. a Fakes projects should always be excluded, regardless
of whether or not they match the project filter).
Also, this project will do nothing if $(SonarQubeExclude) has already been set.
The regular expression uses the normal .NET regular expression syntax.
Usage:
(1) include the target in the projects being built, either by directly importing it or by
dropping it in the one of the standard "ImportBefore" folders.
(2) set $(SQExclusionFilter) to the desired regular expression
e.g. the following example matches all projects with "CodeSense\Services" in the path: .*\\CodeSense\\Services\\.*
-->
<PropertyGroup Condition=" $(SonarQubeExclude) == '' AND $(SQExclusionFilter) != '' ">
<MatchesSQExclusionFilter Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectFullPath), $(SQExclusionFilter), System.Text.RegularExpressions.RegexOptions.IgnoreCase)) ">true</MatchesSQExclusionFilter>
<SonarQubeExclude Condition="$(MatchesSQExclusionFilter) == 'true' " >true</SonarQubeExclude>
</PropertyGroup>
<!-- This target is not required: it simply writes out additional information to simplify debugging -->
<Target Name="AnalysisProjectInfoExclude_DEBUG" BeforeTargets="CoreCompile"
Condition="$(SQExclusionFilter) != '' ">
<Message Importance="high" Text="ExclusionFilter: filter has been set. Filter= $(SQExclusionFilter)" />
<Message Importance="high" Text="ExclusionFilter: current project = $(MSBuildProjectFullPath)" />
<Message Importance="high" Text="ExclusionFilter: match result = $(MatchesSQExclusionFilter)" />
<Message Importance="high" Condition="$(MatchesSQExclusionFilter) == 'true' "
Text="ExclusionFilter: project is excluded" />
<Message Importance="high" Condition="$(MatchesSQExclusionFilter) != 'true' "
Text="ExclusionFilter: project has not been excluded by the exclusion filter" />
</Target>
</Project>
此片段将包含在所有项目文件中,如此处所述
https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build
相应地在环境变量SQExclusionFilter中设置正则表达式。使用双反斜杠进行路径分隔。在 Windows shell 中,使用插入符号转义管道字符:例如
set SQExclusionFilter=(path1\\project)^|(path2\\project)
感谢来自 SQ/MS 的 Duncan Pocklington!