dotnetフォーマットコマンドとstylecop.アナライザ


この記事ではdotnetフォーマットコマンドを使用する方法について説明します.EditorConfigとその制限を示し、そのスタイルを示します.アナライザはそれらを克服できる.この記事では、StyleCop Rulletetをソリューション内のすべてのプロジェクトに適用する方法についても触れます.

DOTNETフォーマットについて


DOTNETフォーマットは、ルーレットに従って一度にすべてのソースコードをプロジェクトまたは解決にフォーマットすることができます..NET SDK Version 6.0以降では、既定でDOTNET形式が含まれます.あなたが使うならば.NETコア3.1では、次のようにインストールできます.
dotnet tool install -g dotnet-format
dotnetフォーマットは一つ以上のルールセットを読み込みます.ターゲットプロジェクトまたはソリューションフォルダまたはその先祖フォルダのeditorconfigファイル.C# Coding Styleに従ってソースコードをフォーマットする場合は、この.editorconfigを使用できます.NETランタイムリポジトリ.
DOTNET形式を使用する場合は.EditorConfig情報レベルのseverityを指定する必要があります.さもなければ、DOTNETフォーマットは規則のほとんどを無視します.
dotnet format -- versionが6.0以上である場合
dotnet format --severity info
Otherwise
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。アナライザ


より規則正しい結果を得るために、StyleCop.Analyzersを使用できます.StyleCopAnalyzerは、伝統的にVisual Studioの拡張機能によって提供されるStyleCoopルールセットを強制する方法を提供します.
StyleCopを使用してソースコードをプロジェクトにフォーマットするとき.アナライザを使用すると、stylecopを追加する必要があります.分析パッケージをプロジェクトに次のようにします.次に、stylecop.アナライザはデフォルトのルールセットで動作します.
dotnet add package Stylecop.Analyzers
デフォルトのルールセットはコーディングスタイルに従っていません.したがって、ダウンロードして、スタイルからthe default ruleset fileを調整する必要があります.分析倉庫.ルールセットファイルをStyleCopとして保存するときは、次の行をプロジェクトファイルに追加する必要があります.ルールセット.
<PropertyGroup>
  <CodeAnalysisRuleSet>stylecop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup></script>
次に、StyleCopのコーディングスタイルに従ってルールを調整できます.以下の通り.あなたは私の倉庫で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とソースコードをフォーマットできます.アナライザ.dotnetフォーマットのバージョンが6.0以上であるならば、stypecopを使用する特別な何も必要としません.アナライザ.あなたは上記と同じコマンドを使用できます.
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');
}

ディレクトリ.ビルド.小道具


ソリューションフォルダー内のすべてのプロジェクトをフォーマットする必要がある場合は、StyleCopを追加する必要があります.各プロジェクトへのアナライザパッケージ.しかし、この努力を排除する方法は、ディレクトリです.ビルド.小道具ファイル.
ディレクトリを置くとき.ビルド.ソリューションフォルダの小道具、msbuildはこのファイルを各プロジェクトファイルの先頭にインポートします.それで、あなたは以下のディレクトリを置くことができます.ビルド.StyleCopを作るためにソリューションフォルダのファイルをプロップします.すべてのプロジェクトで利用できる分析器.
<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で使用する方法を説明しました.アナライザとディレクトリ.ビルド.小道具ファイル.あなたはそれらを使用して、より多くの規律の結果を得るためにソリューションフォルダ内のすべてのプロジェクトでソースコードをフォーマットすることができます.エディトファイル.