問題 私たちの組織では、さまざまな Web サービスで複数の GitHub リポジトリを実行しています。これらすべてのプロジェクトには、コードのスタイリングに関する共通のルールが必要です。私たちは正しい方向に進み、すべての .NET ソリューションの基礎となり、共通のアーキテクチャを定義するサービス テンプレート プロジェクトを作成しました。これには、正しい名前と参照を持つ一連のプロジェクトが含まれています。しかし、私たちは間違った方法で移動し、 ファイルをすべての新しいリポジトリにコピーしました。 ファイルが開発者のニーズに合わないときはいつでも変更したくなる誘惑がありました。そして、私たちはこの過ちを犯しました。 .editorconfig .editorconfig 共通の ファイルを作成し、それを複数のリポジトリに配布する方法について、インターネット上にはあまり情報がありません。これは NuGet パッケージに違いない、という神々しい感じがしました。問題を長い間グーグルで調べた後、 解決策を見つけました。彼のプロジェクトで同じ問題を解決してくれた に感謝します。 .editorconfig この Adam Craven なぜ EditorConfig EditorConfig は、さまざまなエディターや IDE で同じプロジェクトに取り組んでいる複数の開発者が一貫したコーディング スタイルを維持するのに役立ちます。 EditorConfig プロジェクトは、コーディング スタイルを定義するための 形式と、編集者がファイル形式を読み取って定義されたスタイルに準拠できるようにする のコレクションで構成されます。 EditorConfig ファイルは読みやすく、バージョン管理システムとうまく連携します。 ファイル テキスト エディター プラグイン .NET の世界では、コード分析ルールにさまざまな構成オプションがあります。これらのオプションは、次のアナライザー構成ファイルのいずれかでキーと値のペアとして指定します。 ファイル: ファイルベースまたはフォルダーベースの構成オプション。 EditorConfig ファイル: プロジェクト レベルの構成オプション。一部のプロジェクト ファイルがプロジェクト フォルダの外にある場合に便利です。 グローバル AnalyzerConfig 次の構文を使用して、EditorConfig ファイルでコンパイラ警告またはアナライザー ルールの重大度を設定できます。 dotnet_diagnostic.<rule ID>.severity = <severity> EditorConfig ファイルでルールの を設定すると、ルール セットまたはソリューション エクスプローラーで設定された重大度よりも優先されます。 重大度 一部のプロジェクトでは、ローカル構成ファイルとグローバル構成ファイルが混在しています。さらに、EditorConfg には、この記事の セクションでも指定されている .NET の世界でいくつかの制限があります。私たちは両方の方法を試し、これら 2 つのアプローチを行ったり来たりしました。そして最終的に、プロジェクトに EditoConfig のみを使用する簡単な方法に移行することにしました。 制限 ソリューション まず最初に、NuGet パッケージ用の新しい C# ライブラリ プロジェクトを作成する必要があります。 と呼びましょう。このプロジェクトには、次のファイルが含まれます。 MyProject.EditorConfig ファイル .props ファイル .csproj ファイル .editorconfig .props ファイル 次のプロパティを true 値に設定して PropertyGroup を追加する必要があります。 <PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup> - EditorConfig ファイルで指定された をビルドの一部としてチェックできるようにします。 EnforceCodeStyleInBuild コード スタイル ルール は が、以前のバージョンの .NET をサポートするには true に設定してください。 EnableNETAnalyzers 、.NET 5.0 のデフォルトで true です EditorConfig の制限の 1 つとして、一部のルールには があり、EditorConfig ファイルで指定できないことがあります。 Global AnalyzerConfig ファイルを使用しない場合は、 ファイルでこれらのルールを無効にするオプションがあります。 Location.None .props <PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup> NuGet パッケージ フォルダー構造内からコピーする ファイルの場所を指定します。 .editorconfig <ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup> 異なるプラットフォームでは、ファイル パス文字列内の および 記号に注意してください。 ファイルがコピーされない理由を突き止めるのに本当に時間がかかりました。 \ / .editorconfig MSBuild タスクを使用して、ビルド中の .NET プロジェクトのフォルダーにファイルをコピーします。このターゲットは、MSBuild ターゲットの前に実行するように定義されています。 Copy BeforeBuild <Target Name="CopyEditorConfig" BeforeTargets="BeforeBuild"> <Message Text="Copying the .editorconfig file from '@(EditorConfigFilesToCopy)' to '$(SolutionFolder)'"></Message> <Copy SourceFiles="@(EditorConfigFilesToCopy)" DestinationFolder="$(SolutionFolder)" SkipUnchangedFiles="true" UseHardlinksIfPossible="false" /> </Target> .csproj ファイル 既定では、ピリオドで始まる NuGet ファイルをパックするときに無視されます。これを回避するには、次のコードを ファイルに追加する必要があります。 .csproj <PropertyGroup> <NoDefaultExcludes>true</NoDefaultExcludes> </PropertyGroup> その後、 および ファイルを含める必要があります。 .props .editorconfig <ItemGroup> <None Include="MyProject.EditorConfig.props" Pack="true" PackagePath="\build" /> <None Include=".editorconfig" Pack="true" PackagePath="\content\Rules" /> </ItemGroup> NuGet パッケージをビルドしてテストする すべてのジョブが完了したら、NuGet パッケージをローカル ストレージに発行して、動作することを確認できます。 プロジェクト フォルダーで次のコマンドを実行して、NuGet パッケージをパックします。 MyProject.EditorConfig dotnet pack MyProject.EditorConfig.csproj -c Release -o out --no-restore ローカル ストレージ (フォルダー) に公開します。 は事前にインストールする必要があります。 NuGet CLI nuget add out/MyProject.EditorConfig.1.0.0.nupkg -Source /Users/igorlopushko/test_nuget_expand/ -Expand パラメーターでターゲット フォルダーを指定します。 -Source ローカル NuGet パッケージ パスを登録します。 dotnet nuget add source /Users/igorlopushko/test_nuget_expand/ ローカル NuGet パッケージをターゲット プロジェクトに追加するには、ターゲット プロジェクトのフォルダーで次のコマンドを実行します。 dotnet add package MyProject.EditorConfig -s /Users/igorlopushko/test_nuget_expand/ ターゲット プロジェクトをビルドすると、このプロジェクトのルート ディレクトリに ファイルが作成されます。プロジェクトをビルドするたびに上書きされます。何らかの形で誤って変更された場合でも、 ファイルはビルド時に上書きされます。 .editorconfig .editorconfig 結論 解決策は非常に単純ですが、チームの生活が楽になりました。この NuGet パッケージをすべてのプロジェクトに追加し、すべてのリポジトリでコード スタイルの非同期化を回避しました。