dotnet 형식 명령 및 StyleCop.Analyzers

18842 단어 csharp
이 문서에서는 .editorconfig 및 제한 사항과 함께 dotnet 형식 명령을 사용하는 방법을 설명하고 StyleCop.Analyzers가 이를 극복할 수 있음을 보여줍니다. 이 문서에서는 솔루션의 모든 프로젝트에 StyleCop 규칙 집합을 적용하는 방법도 설명합니다.

닷넷 형식 정보



dotnet 형식은 규칙 세트에 따라 프로젝트 또는 솔루션에서 한 번에 모든 소스 코드의 형식을 지정할 수 있습니다. .NET SDK 버전 6.0 이상에는 기본적으로 dotnet 형식이 포함되어 있습니다. .NET Core 3.1을 사용하는 경우 다음과 같이 설치할 수 있습니다.

dotnet tool install -g dotnet-format


dotnet 형식은 대상 프로젝트나 솔루션 폴더 또는 해당 조상 폴더의 .editorconfig 파일에서 하나 이상의 규칙 집합을 읽습니다. C# Coding Style을 따르도록 소스 코드의 형식을 지정하려는 경우 .NET 런타임 리포지토리에서 이.editorconfig를 사용할 수 있습니다.

.editorconfig와 함께 dotnet 형식을 사용하는 경우 정보 수준 심각도를 지정해야 합니다. 그렇지 않으면 dotnet 형식이 대부분의 규칙을 무시합니다.

dotnet 형식 --version이 6.0 이상을 표시하는 경우

dotnet format --severity info


그렇지 않으면

dotnet format --fix-style info


위의 명령은 다음 코드를 다음 코드로 포맷합니다.

async private Task<string> readLineAsync(NetworkStream stream)
{
    var result = new List<byte>();
    var buffer = new byte[1];


    do {
        var n = await stream.ReadAsync(buffer);
        if ( n == 0 ) break;
        result.Add(buffer[0]);
    } while ( buffer[0] != 0x0a );

    return Encoding.UTF8.GetString(result.ToArray()).TrimEnd('\r', '\n');

}



private async Task<string> readLineAsync(NetworkStream stream)
{
    var result = new List<byte>();
    byte[] buffer = new byte[1];


    do
    {
        int n = await stream.ReadAsync(buffer);
        if (n == 0) break;
        result.Add(buffer[0]);
    } while (buffer[0] != 0x0a);

    return Encoding.UTF8.GetString(result.ToArray()).TrimEnd('\r', '\n');

}


이 결과는 충분하지 않습니다. 코딩 스타일에도 불구하고 메서드 이름은 camelCase를 유지하고 if 문은 한 줄로 유지됩니다. 불필요한 빈 줄도 있습니다.

StyleCop.Analyzers



보다 엄격한 결과를 얻으려면 StyleCop.Analyzers을 사용할 수 있습니다. StyleCop.Analyzers는 전통적으로 Visual Studio용 확장에서 제공하는 StyleCop 규칙 집합을 적용하는 방법을 제공합니다.

StyleCop.Analyzers를 사용하여 프로젝트에서 소스 코드의 형식을 지정하는 경우 다음과 같이 StyleCop.Analyzers 패키지를 프로젝트에 추가해야 합니다. 그러면 StyleCop.Analyzers가 기본 규칙 세트와 함께 작동합니다.

dotnet add package Stylecop.Analyzers


기본 규칙 세트는 코딩 스타일을 따르지 않습니다. 따라서 StyleCop.Analyzers 저장소에서 다운로드 및 조정the default ruleset file해야 합니다. 규칙 세트 파일을 stylecop.ruleset로 저장할 때 프로젝트 파일에 다음 줄을 추가해야 합니다.

<PropertyGroup>
  <CodeAnalysisRuleSet>stylecop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup></script>


그런 다음 다음과 같이 stylecop.ruleset에서 코딩 스타일을 따르도록 규칙을 조정할 수 있습니다. 내 저장소에서 다운로드the adjusted file할 수 있습니다.

--- StyleCopAnalyzersDefault.ruleset    2022-03-13 18:23:36.312971000 +0900
+++ stylecop.ruleset    2022-03-13 18:26:56.342161300 +0900
@@ -38,7 +38,7 @@

     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.ReadabilityRules">
         <Rule Id="SA1100"  Action="Warning" />          <!-- Do not prefix calls with base unless local implementation exists -->
-        <Rule Id="SA1101"  Action="Warning" />          <!-- Prefix local calls with this -->
+        <Rule Id="SA1101"  Action="None" />             <!-- Prefix local calls with this -->
         <Rule Id="SA1102"  Action="Warning" />          <!-- Query clause should follow previous clause -->
         <Rule Id="SA1103"  Action="Warning" />          <!-- Query clauses should be on separate lines or all on one line -->
         <Rule Id="SA1104"  Action="Warning" />          <!-- Query clause should begin on new line when previous clause spans multiple lines -->
@@ -75,11 +75,11 @@
         <Rule Id="SA1136"  Action="Warning" />          <!-- Enum values should be on separate lines -->
         <Rule Id="SA1137"  Action="Warning" />          <!-- Elements should have the same indentation -->
         <Rule Id="SA1139"  Action="Warning" />          <!-- Use literal suffix notation instead of casting -->
-        <Rule Id="SX1101"  Action="None" />             <!-- Do not prefix local calls with 'this.' -->
+        <Rule Id="SX1101"  Action="Warning" />          <!-- Do not prefix local calls with 'this.' -->
     </Rules>

     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.OrderingRules">
-        <Rule Id="SA1200"  Action="Warning" />          <!-- Using directives should be placed correctly -->
+        <Rule Id="SA1200"  Action="None" />             <!-- Using directives should be placed correctly -->
         <Rule Id="SA1201"  Action="Warning" />          <!-- Elements should appear in the correct order -->
         <Rule Id="SA1202"  Action="Warning" />          <!-- Elements should be ordered by access -->
         <Rule Id="SA1203"  Action="Warning" />          <!-- Constants should appear before fields -->
@@ -105,16 +105,16 @@
         <Rule Id="SA1303"  Action="Warning" />          <!-- Const field names should begin with upper-case letter -->
         <Rule Id="SA1304"  Action="Warning" />          <!-- Non-private readonly fields should begin with upper-case letter -->
         <Rule Id="SA1305"  Action="None" />             <!-- Field names should not use Hungarian notation -->
-        <Rule Id="SA1306"  Action="Warning" />          <!-- Field names should begin with lower-case letter -->
+        <Rule Id="SA1306"  Action="None" />             <!-- Field names should begin with lower-case letter -->
         <Rule Id="SA1307"  Action="Warning" />          <!-- Accessible fields should begin with upper-case letter -->
         <Rule Id="SA1308"  Action="Warning" />          <!-- Variable names should not be prefixed -->
-        <Rule Id="SA1309"  Action="Warning" />          <!-- Field names should not begin with underscore -->
+        <Rule Id="SA1309"  Action="None" />             <!-- Field names should not begin with underscore -->
         <Rule Id="SA1310"  Action="Warning" />          <!-- Field names should not contain underscore -->
         <Rule Id="SA1311"  Action="Warning" />          <!-- Static readonly fields should begin with upper-case letter -->
         <Rule Id="SA1312"  Action="Warning" />          <!-- Variable names should begin with lower-case letter -->
         <Rule Id="SA1313"  Action="Warning" />          <!-- Parameter names should begin with lower-case letter -->
         <Rule Id="SA1314"  Action="Warning" />          <!-- Type parameter names should begin with T -->
-        <Rule Id="SX1309"  Action="None" />             <!-- Field names should begin with underscore -->
+        <Rule Id="SX1309"  Action="Warning" />          <!-- Field names should begin with underscore -->
         <Rule Id="SX1309S" Action="None" />             <!-- Static field names should begin with underscore -->
     </Rules>

@@ -140,7 +140,7 @@
         <Rule Id="SA1500"  Action="Warning" />          <!-- Braces for multi-line statements should not share line -->
         <Rule Id="SA1501"  Action="Warning" />          <!-- Statement should not be on a single line -->
         <Rule Id="SA1502"  Action="Warning" />          <!-- Element should not be on a single line -->
-        <Rule Id="SA1503"  Action="Warning" />          <!-- Braces should not be omitted -->
+        <Rule Id="SA1503"  Action="None" />             <!-- Braces should not be omitted -->
         <Rule Id="SA1504"  Action="Warning" />          <!-- All accessors should be single-line or multi-line -->
         <Rule Id="SA1505"  Action="Warning" />          <!-- Opening braces should not be followed by blank line -->
         <Rule Id="SA1506"  Action="Warning" />          <!-- Element documentation headers should not be followed by blank line -->


dotnet 형식은 StyleCop.Analyzers로 소스 코드의 형식을 지정할 수 있습니다. dotnet 형식의 버전이 6.0 이상인 경우 StypeCop.Analyzers를 사용하기 위해 특별한 사항이 필요하지 않습니다. 위에 표시된 것과 동일한 명령을 사용할 수 있습니다.

dotnet format --severity info


버전이 5.*인 경우 추가 옵션으로 명령을 실행해야 합니다.

dotnet format --fix-style info --fix-analyzers info


위의 명령을 실행하면 이전 결과보다 훨씬 나은 다음 결과를 얻을 수 있습니다.

private async Task<string> ReadLineAsync(NetworkStream stream)
{
    var result = new List<byte>();
    byte[] buffer = new byte[1];

    do
    {
        int n = await stream.ReadAsync(buffer);
        if (n == 0)
            break;
        result.Add(buffer[0]);
    }
    while (buffer[0] != 0x0a);

    return Encoding.UTF8.GetString(result.ToArray()).TrimEnd('\r', '\n');
}


Directory.Build.props



솔루션 폴더의 모든 프로젝트를 포맷해야 하는 경우 각 프로젝트에 StyleCop.Analyzers 패키지를 추가해야 합니다. 그러나 Directory.Build.props 파일을 사용하면 이러한 작업을 제거할 수 있습니다.

Directory.Build.props를 솔루션 폴더에 넣으면 MSBuild는 이 파일을 각 프로젝트 파일의 맨 위로 가져옵니다. 따라서 솔루션 폴더에 다음 Directory.Build.props 파일을 배치하여 모든 프로젝트에서 Stylecop.Analyzers를 사용할 수 있도록 할 수 있습니다.

<Project>
  <PropertyGroup>
    <CodeAnalysisRuleSet>..\stylecop.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
</Project>


결론



StyleCop.Analyzers 및 Directory.Build.props 파일과 함께 dotnet 형식 명령을 사용하는 방법을 설명했습니다. 솔루션 폴더의 모든 프로젝트에서 소스 코드를 포맷하여 사용하고 .editorconfig 파일을 사용할 때보다 더 잘 훈련된 결과를 얻을 수 있습니다.

좋은 웹페이지 즐겨찾기