web-dev-qa-db-ja.com

Sonarqubeに.NET(C#)プロジェクトをカバレッジ測定から除外させる方法

Sonarqubeでは、sonar.coverage.exclusionsキーにパターンを追加することで、個々のファイルをコードカバレッジから除外できます。これは、UIに追加することでプロジェクトレベルで実行でき、SonarQubeSetting要素を指定して.csprojファイルに追加することもできます。つまり.

<SonarQubeSetting Include="sonar.coverage.exclusions"> <Value>**/*.cs</Value> </SonarQubeSetting>

ただし、これらのアプローチはどちらも機能していないようです。 SonarQube documentation で指定されているように、パターンで遊んでも、望ましい結果が得られません。 SonarQubeExcludeMSBuildプロパティの存在も認識していますが、プロジェクトが除外されるため、そのパスをたどりたくありません。他のすべての分析。

私が行方不明になっている別の可能性はありますか?または、プロジェクト内のすべてのクラスをコードカバレッジから除外することは単に不可能ですか?

8
mvandevy

コメントするのに十分な担当者ではありませんが、ここで両方の回答を適用する場合は、次を追加するだけです。

<PropertyGroup>
    <!-- Exclude the project from analysis -->
    <SonarQubeExclude>true</SonarQubeExclude>
</PropertyGroup>

.csprojファイルで、個々のファイルではなくプロジェクト全体を除外するか、sonarqubeフィルターに依存します。

5
Jonas Mohammed

上記の回答を要約し、それに1つのポイントを追加します。

  1. SonarQube Analysisからプロジェクトをcsprojから除外するには、そのプロジェクトの.csprojに以下のコードを追加することで実現できます。

    <PropertyGroup>
    <!-- Exclude the project from analysis -->
    <SonarQubeExclude>true</SonarQubeExclude>
    </PropertyGroup>
    
  2. プロジェクトからファイルを除外するには

     <ItemGroup>
     <SonarQubeSetting Include="sonar.coverage.exclusions">
     <Value>**/FileName.cs</Value>
     </SonarQubeSetting>
     </ItemGroup>
    
  3. そして複数のファイルの場合

    <ItemGroup>
    <SonarQubeSetting Include="sonar.coverage.exclusions">
    <Value>**/FileName1.cs, **/FileName2.cs</Value>
    </SonarQubeSetting>
    </ItemGroup>
    

正規表現パターン 使用についてもこれを参照できます

3
Naveen R Kumar

何千ものことを試した後、私はついに解決策を見つけました。 .csprojにアイテムグループを追加する必要があります。

<ItemGroup>
    <Compile Update="ClassToExclude.cs">
      <!-- Exclude the file from analysis -->
      <SonarQubeExclude>true</SonarQubeExclude>
    </Compile>
  </ItemGroup>
0
Andre Mendonca

私も同じ問題を抱えていましたが、それを理解するのに少し時間がかかりました。

次の内容でソリューションディレクトリに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://docs.Microsoft.com/en-us/visualstudio/msbuild/customize-your-build

それに応じて、環境変数SQExclusionFilterに正規表現を設定します。パスの区切りには二重円記号を使用します。 Windowsでは、キャレット付きのシェルエスケープパイプ文字:例:.

set SQExclusionFilter=(path1\\project)^|(path2\\project)

SQ/MSからDuncanPocklingtonへのクレジット!

0
Reinhard Mayr

いくつかの概念:

.NETソリューションはSonarqubeのプロジェクトです。 .NETソリューションのプロジェクトは、Sonarqubeのプロジェクトのモジュールです。

Sonarqubeのモジュール(.NETプロジェクト)をコードカバレッジから除外するための2つの解決策を見つけました。

1)Web UI Sonarqubeからの除外を構成します

From: SonarQube MSBuild Scannerは分析からファイルを除外しません

  • Sonarqubeのプロジェクトを開く->コード(トップメニュー内)
  • Sonarqubeのモジュールを開きます(左アイコン 'コンポーネントのページを開く)->管理(トップメニュー内)->一般設定
  • コードカバレッジ除外に**を追加します:

(フランス語のスクリーンショットですが、アイデアはわかります) Sonarqube Web UI

2)csprojにプロパティ「sonar.coverage.exclusions」を追加します

<.NETプロジェクト> .csprojに次を追加します。

<Project ...>
  ...
  <Target Name="BeforeBuild">
    <ItemGroup>
      <SonarQubeSetting Include="sonar.coverage.exclusions">
        <Value>**</Value>
      </SonarQubeSetting>
    </ItemGroup>
  </Target>
  ...
</Project>

この2つのソリューションは私には有効ですが、Sonarqubeのプロジェクト(.NETソリューション)のグローバル設定を希望します。

0
Orwel