私たちの組織では、さまざまな Web サービスで複数の GitHub リポジトリを実行しています。これらすべてのプロジェクトには、コードのスタイリングに関する共通のルールが必要です。私たちは正しい方向に進み、すべての .NET ソリューションの基礎となり、共通のアーキテクチャを定義するサービス テンプレート プロジェクトを作成しました。これには、正しい名前と参照を持つ一連のプロジェクトが含まれています。しかし、私たちは間違った方法で移動し、 .editorconfig
ファイルをすべての新しいリポジトリにコピーしました。 .editorconfig
ファイルが開発者のニーズに合わないときはいつでも変更したくなる誘惑がありました。そして、私たちはこの過ちを犯しました。
共通の.editorconfig
ファイルを作成し、それを複数のリポジトリに配布する方法について、インターネット上にはあまり情報がありません。これは NuGet パッケージに違いない、という神々しい感じがしました。問題を長い間グーグルで調べた後、この解決策を見つけました。彼のプロジェクトで同じ問題を解決してくれたAdam Cravenに感謝します。
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
ファイル次のプロパティを true 値に設定して PropertyGroup を追加する必要があります。
<PropertyGroup> <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> <EnableNETAnalyzers>true</EnableNETAnalyzers> </PropertyGroup>
EnforceCodeStyleInBuild
- EditorConfig ファイルで指定されたコード スタイル ルールをビルドの一部としてチェックできるようにします。EnableNETAnalyzers
は、.NET 5.0 のデフォルトで true ですが、以前のバージョンの .NET をサポートするには true に設定してください。
EditorConfig の制限の 1 つとして、一部のルールにはLocation.None
があり、EditorConfig ファイルで指定できないことがあります。 Global AnalyzerConfig ファイルを使用しない場合は、 .props
ファイルでこれらのルールを無効にするオプションがあります。
<PropertyGroup> <NoWarn>$(NoWarn);CA1014</NoWarn> </PropertyGroup>
NuGet パッケージ フォルダー構造内からコピーする.editorconfig
ファイルの場所を指定します。
<ItemGroup> <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)../content/Rules/.editorconfig" /> </ItemGroup>
異なるプラットフォームでは、ファイル パス文字列内の
\
および/
記号に注意してください。.editorconfig
ファイルがコピーされない理由を突き止めるのに本当に時間がかかりました。
MSBuild Copy
タスクを使用して、ビルド中の .NET プロジェクトのフォルダーにファイルをコピーします。このターゲットは、MSBuild 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>
既定では、ピリオドで始まる 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 パッケージをローカル ストレージに発行して、動作することを確認できます。
MyProject.EditorConfig
プロジェクト フォルダーで次のコマンドを実行して、NuGet パッケージをパックします。
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 パッケージをすべてのプロジェクトに追加し、すべてのリポジトリでコード スタイルの非同期化を回避しました。