코드 메트릭 데이터 생성

다음 세 가지 방법으로 코드 메트릭 데이터를 생성할 수 있습니다.

.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. 솔루션 탐색기에서 하나 이상의 프로젝트를 선택합니다.

  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.Metics(2.9.5)부터, SourceLinesExecutableLines는 이전의 LinesOfCode 메트릭을 대체합니다. 새 메트릭에 대한 설명은 코드 메트릭 값을 참조하세요. LinesOfCode 메트릭은 레거시 모드에서 사용할 수 있습니다.

CyclomaticComplexityMaintainabilityIndex와 같은 기타 메트릭은 이전 버전의 Metrics.exe와 동일한 수식을 사용하지만 새 도구는 IL(중간 언어) 명령 대신 IOperations(논리적 소스 명령)의 수를 계산합니다. 이러한 수치는 Visual Studio IDE 및 이전 버전의 Metrics.exe에서 생성되는 것과는 약간 다릅니다.