paint-brush
一般的な EditorConfig を NuGet パッケージとして使用する方法@igorlopushko
6,868 測定値
6,868 測定値

一般的な EditorConfig を NuGet パッケージとして使用する方法

Igor Lopushko1m2022/06/17
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

EditorConfig は、さまざまなエディターや IDE で同じプロジェクトに取り組んでいる複数の開発者が一貫したコーディング スタイルを維持するのに役立ちます。 EditorConfig ファイルは読みやすく、バージョン管理システムとうまく連携します。 EditorConfg には、この記事の [制限] セクションでも指定されている .NET の世界でいくつかの制限があります。 EditorConfig プロジェクトは、コーディング スタイルを定義するためのファイル形式**と、編集者がファイル形式を読み取って定義されたスタイルに準拠できるようにするテキスト エディター プラグインのコレクション** で構成されています。

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 一般的な EditorConfig を NuGet パッケージとして使用する方法
Igor Lopushko HackerNoon profile picture

問題

私たちの組織では、さまざまな Web サービスで複数の GitHub リポジトリを実行しています。これらすべてのプロジェクトには、コードのスタイリングに関する共通のルールが必要です。私たちは正しい方向に進み、すべての .NET ソリューションの基礎となり、共通のアーキテクチャを定義するサービス テンプレート プロジェクトを作成しました。これには、正しい名前と参照を持つ一連のプロジェクトが含まれています。しかし、私たちは間違った方法で移動し、 .editorconfigファイルをすべての新しいリポジトリにコピーしました。 .editorconfigファイルが開発者のニーズに合わないときはいつでも変更したくなる誘惑がありました。そして、私たちはこの過ちを犯しました。


共通の.editorconfigファイルを作成し、それを複数のリポジトリに配布する方法について、インターネット上にはあまり情報がありません。これは NuGet パッケージに違いない、という神々しい感じがしました。問題を長い間グーグルで調べた後、この解決策を見つけました。彼のプロジェクトで同じ問題を解決してくれた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 の制限の 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>

.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 パッケージをローカル ストレージに発行して、動作することを確認できます。


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 パッケージをすべてのプロジェクトに追加し、すべてのリポジトリでコード スタイルの非同期化を回避しました。