次の方法で共有


コード メトリック データを生成する

コード メトリック データは、次の 3 つの方法で生成できます。

.NET コード品質アナライザーのコード メトリック ルール

.NET コード品質アナライザーには、いくつかのコード メトリック アナライザー ルールが含まれています。

これらのルールは既定では無効になっていますが、 ソリューション エクスプローラー または EditorConfig ファイルで有効にできます。 たとえば、規則 CA1502 を警告として有効にするには、EditorConfig ファイルに次のエントリが含まれます。

dotnet_diagnostic.CA1502.severity = warning

コンフィギュレーション

コード メトリック ルールが起動されるしきい値を構成できます。

  1. テキスト ファイルを作成します。 例として、 CodeMetricsConfig.txt名前を付けることができます。

  2. 必要なしきい値を次の形式でテキスト ファイルに追加します。

    CA1502: 10
    

    この例では、ルール CA1502 は、メソッドのサイクロマティック複雑度が 10 を超える場合に発生するように構成されています。

  3. Visual Studio の [プロパティ ] ウィンドウまたはプロジェクト ファイルで、構成ファイルのビルド アクションを AdditionalFiles としてマークします。 例えば次が挙げられます。

    <ItemGroup>
      <AdditionalFiles Include="CodeMetricsConfig.txt" />
    </ItemGroup>
    

コード メトリックを計算するメニューコマンド

[分析>計算コード メトリック] メニューを使用して、IDE で開いている 1 つまたはすべてのプロジェクトのコード メトリックを生成します。

ソリューション全体のコード メトリックの結果を生成する

ソリューション全体のコード メトリックの結果は、次のいずれかの方法で生成できます。

  • メニュー バーから、[ 分析>コード メトリックの計算>ソリューション] の順に選択します。

  • ソリューション エクスプローラーで、ソリューションを右クリックし、[コード メトリックの計算] を選択します。

  • [ コード メトリックの結果 ] ウィンドウで、[ ソリューションのコード メトリックの計算 ] ボタンを選択します。

結果が生成され、[ コード メトリックの結果 ] ウィンドウが表示されます。 結果の詳細を表示するには、[ 階層] 列のツリーを展開します。

1 つ以上のプロジェクトのコード メトリックの結果を生成する

  1. ソリューション エクスプローラーで、1 つ以上のプロジェクトを選択します。

  2. メニュー バーで、[ 分析>コード メトリックの計算>選択したプロジェクト用] を選択します。

結果が生成され、[ コード メトリックの結果 ] ウィンドウが表示されます。 結果の詳細を表示するには、 階層のツリーを展開します。

コマンド ライン コードメトリック

.NET Framework、.NET Core、.NET Standard アプリ用の C# および Visual Basic プロジェクトのコマンド ラインからコード メトリック データを生成できます。 コマンド ラインからコード メトリックを実行するには、 Microsoft.CodeAnalysis.Metrics NuGet パッケージ をインストールするか、Metrics.exe実行可能ファイルを自分 ビルドします。

Microsoft.CodeAnalysis.Metrics NuGet パッケージ

コマンド ラインからコード メトリック データを生成する最も簡単な方法は、 Microsoft.CodeAnalysis.Metrics NuGet パッケージをインストールすることです。 パッケージをインストールしたら、プロジェクト ファイルを含むディレクトリから msbuild /t:Metrics を実行します。 例えば次が挙げられます。

C:\source\repos\ClassLibrary3\ClassLibrary3>msbuild /t:Metrics
Microsoft (R) Build Engine version 16.0.360-preview+g9781d96883 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 1/22/2019 4:29:57 PM.
Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" on node 1 (Metrics target(s))
.
Metrics:
  C:\source\repos\ClassLibrary3\packages\Microsoft.CodeMetrics.2.6.4-ci\build\\..\Metrics\Metrics.exe /project:C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj /out:ClassLibrary3.Metrics.xml
  Loading ClassLibrary3.csproj...
  Computing code metrics for ClassLibrary3.csproj...
  Writing output to 'ClassLibrary3.Metrics.xml'...
  Completed Successfully.
Done Building Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" (Metrics target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

/p:MetricsOutputFile=<filename>を指定することで、出力ファイル名をオーバーライドできます。 を指定して/p:LEGACY_CODE_METRICS_MODE=trueコード メトリック データを取得することもできます。 例えば次が挙げられます。

C:\source\repos\ClassLibrary3\ClassLibrary3>msbuild /t:Metrics /p:LEGACY_CODE_METRICS_MODE=true /p:MetricsOutputFile="Legacy.xml"
Microsoft (R) Build Engine version 16.0.360-preview+g9781d96883 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 1/22/2019 4:31:00 PM.
The "MetricsOutputFile" property is a global property, and cannot be modified.
Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" on node 1 (Metrics target(s))
.
Metrics:
  C:\source\repos\ClassLibrary3\packages\Microsoft.CodeMetrics.2.6.4-ci\build\\..\Metrics.Legacy\Metrics.Legacy.exe /project:C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj /out:Legacy.xml
  Loading ClassLibrary3.csproj...
  Computing code metrics for ClassLibrary3.csproj...
  Writing output to 'Legacy.xml'...
  Completed Successfully.
Done Building Project "C:\source\repos\ClassLibrary3\ClassLibrary3\ClassLibrary3.csproj" (Metrics target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

コードメトリクスの出力

生成された XML 出力の形式は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<CodeMetricsReport Version="1.0">
  <Targets>
    <Target Name="ConsoleApp20.csproj">
      <Assembly Name="ConsoleApp20, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <Metrics>
          <Metric Name="MaintainabilityIndex" Value="100" />
          <Metric Name="CyclomaticComplexity" Value="1" />
          <Metric Name="ClassCoupling" Value="1" />
          <Metric Name="DepthOfInheritance" Value="1" />
          <Metric Name="SourceLines" Value="11" />
          <Metric Name="ExecutableLines" Value="1" />
        </Metrics>
        <Namespaces>
          <Namespace Name="ConsoleApp20">
            <Metrics>
              <Metric Name="MaintainabilityIndex" Value="100" />
              <Metric Name="CyclomaticComplexity" Value="1" />
              <Metric Name="ClassCoupling" Value="1" />
              <Metric Name="DepthOfInheritance" Value="1" />
              <Metric Name="SourceLines" Value="11" />
              <Metric Name="ExecutableLines" Value="1" />
            </Metrics>
            <Types>
              <NamedType Name="Program">
                <Metrics>
                  <Metric Name="MaintainabilityIndex" Value="100" />
                  <Metric Name="CyclomaticComplexity" Value="1" />
                  <Metric Name="ClassCoupling" Value="1" />
                  <Metric Name="DepthOfInheritance" Value="1" />
                  <Metric Name="SourceLines" Value="7" />
                  <Metric Name="ExecutableLines" Value="1" />
                </Metrics>
                <Members>
                  <Method Name="void Program.Main(string[] args)" File="C:\source\repos\ConsoleApp20\ConsoleApp20\Program.cs" Line="7">
                    <Metrics>
                      <Metric Name="MaintainabilityIndex" Value="100" />
                      <Metric Name="CyclomaticComplexity" Value="1" />
                      <Metric Name="ClassCoupling" Value="1" />
                      <Metric Name="SourceLines" Value="4" />
                      <Metric Name="ExecutableLines" Value="1" />
                    </Metrics>
                  </Method>
                </Members>
              </NamedType>
            </Types>
          </Namespace>
        </Namespaces>
      </Assembly>
    </Target>
  </Targets>
</CodeMetricsReport>

Metrics.exe

NuGet パッケージをインストールしない場合は、 Metrics.exe 実行可能ファイルを直接生成して使用できます。 Metrics.exe 実行可能ファイルを生成するには:

  1. dotnet/roslyn-analyzers リポジトリを複製します。

  2. Visual Studio の開発者コマンド プロンプトを管理者として開きます。

  3. roslyn-analyzers リポジトリのルートから、次のコマンドを実行します。Restore.cmd

  4. ディレクトリを src\Tools\Metrics に変更します

  5. 次のコマンドを実行して Metrics.csproj プロジェクトを ビルドします。

    msbuild /m /v:m /p:Configuration=Release Metrics.csproj
    

    Metrics.exe という名前の実行可能ファイルは、リポジトリ ルートの artifacts\bin ディレクトリに生成されます。

Metrics.exe の使用方法

Metrics.exeを実行するには、プロジェクトまたはソリューションと出力 XML ファイルを引数として指定します。 例えば次が挙げられます。

C:\>Metrics.exe /project:ConsoleApp20.csproj /out:report.xml
Loading ConsoleApp20.csproj...
Computing code metrics for ConsoleApp20.csproj...
Writing output to 'report.xml'...
Completed Successfully.

レガシ モード

レガシ モードMetrics.exe をビルドすることを選択できます。 ツールのレガシ モード バージョンでは、以前のバージョンのツールで生成されたメトリック値に近いメトリック値 が生成されます。 さらに、レガシ モードでは、 Metrics.exe は、以前のバージョンのツールで生成されたコード メトリックと同じメソッドの種類のセットのコード メトリックを生成します。 たとえば、フィールド初期化子とプロパティ初期化子のコード メトリック データは生成されません。 レガシ モードは、旧バージョンとの互換性や、コード メトリック番号に基づくコード チェックイン ゲートがある場合に便利です。 レガシ モードで Metrics.exe をビルドするコマンドは次のとおりです。

msbuild /m /v:m /t:rebuild /p:LEGACY_CODE_METRICS_MODE=true Metrics.csproj

詳細については、「 レガシ モードでのコード メトリックの生成を有効にする」を参照してください。

以前のバージョン

Visual Studio 2015 には、 Metrics.exeとも呼ばれるコマンド ライン コード メトリック ツールが含まれていました。 この以前のバージョンのツールでは、バイナリ分析、つまりアセンブリ ベースの分析を行いました。 Metrics.exe ツールの新しいバージョンでは、代わりにソース コードが分析されます。 新しい Metrics.exe ツールはソース コードベースであるため、コマンド ライン コードメトリックの結果は、Visual Studio IDE と以前のバージョンの Metrics.exeによって生成されたものとは異なる場合があります。 Visual Studio 2019 以降、Visual Studio IDE はコマンドライン ツールのようなソース コードを分析します。結果は同じである必要があります。

新しいコマンド ライン コード メトリック ツールは、ソリューションとプロジェクトを読み込むことができる限り、ソース コード エラーが発生した場合でもメトリックを計算します。

メトリック値の違い

Visual Studio 2019 バージョン 16.4 および Microsoft.CodeAnalysis.Metrics (2.9.5) 以降では、前のLinesOfCodeメトリックをSourceLinesしてExecutableLines置き換えます。 新しいメトリックの説明については、「 コード メトリック値」を参照してください。 LinesOfCode メトリックは、レガシ モードで使用できます。

CyclomaticComplexityMaintainabilityIndexなどの他のメトリックでは、以前のバージョンの Metrics.exeと同じ数式が使用されますが、新しいツールでは、中間言語 (IL) 命令ではなく、IOperations (論理ソース命令) の数がカウントされます。 この数値は、Visual Studio IDE と以前のバージョンの Metrics.exeによって生成されたものとは若干異なります。