Start Debugging

.NET 11 Preview 3 で dotnet sln がついに CLI から solution filter を編集

.NET 11 Preview 3 は dotnet sln に .slnf の solution filter でプロジェクトを作成、追加、削除、一覧するやり方を教えます。大規模モノレポが Visual Studio を開かずにサブセットをロードできるようになります。

Solution filter (.slnf) は Visual Studio 2019 から存在していますが、IDE の外で編集するには JSON を手書きする必要がありました。.NET 11 Preview 3 がそれを直します: dotnet slndotnet/sdk #51156 経由で .slnf ファイルの作成、編集、内容の一覧表示を直接できるようになりました。大きなリポジトリにとって、これはターミナルから 20 プロジェクトのサブセットを開くことと、JSON を手で突つくシェルスクリプトを保守することの違いです。

Solution filter の実体

.slnf は親の .sln への JSON ポインターと、プロジェクトパスのリストです。ツールがフィルターをロードすると、リストにない親ソリューション内のすべてのプロジェクトをアンロードします。これによりビルドグラフ、アナライザー、IntelliSense が気にするサブセットに集中し続けます - 大きなコードベースが IDE のロード時間を正気に保つための主要なレバーです。Preview 3 まで、CLI はフィルターを喜んで build できましたが、編集はできませんでした。

新しいコマンド

サーフェスは既存の dotnet sln の動詞を反映しています。フィルターを作成し、プロジェクトを追加・削除し、現在何が含まれているか一覧できます:

# Create a filter that points at the current .sln
dotnet new slnf --name MyApp.slnf

# Target a specific parent solution
dotnet new slnf --name MyApp.slnf --solution-file ./MyApp.sln

# Add and remove projects
dotnet sln MyApp.slnf add src/Lib/Lib.csproj
dotnet sln MyApp.slnf add src/Api/Api.csproj src/Web/Web.csproj
dotnet sln MyApp.slnf remove src/Lib/Lib.csproj

# Inspect what the filter currently loads
dotnet sln MyApp.slnf list

コマンドは dotnet sln.sln ファイル向けに既にサポートしている glob とマルチ引数の形式を受け付けます。Visual Studio が出すものと一致する .slnf JSON を書くので、CLI から編集したフィルターは IDE でもきれいに開きます。

モノレポにとってなぜ重要か

2 つのワークフローがかなり安くなります。1 つ目は CI: パイプラインはリポジトリ全体をチェックアウトし、変更されたパスに関連するフィルターだけをビルドできます。Preview 3 以前、ほとんどのチームはこれを JSON を書くカスタムスクリプトや、.sln の隣に手動保守する .slnf ファイルで行っていました。今や同じパイプラインがフィルターをその場で再生成できます:

dotnet new slnf --name ci-api.slnf --solution-file MonoRepo.sln
dotnet sln ci-api.slnf add \
  src/Api/**/*.csproj \
  src/Shared/**/*.csproj \
  test/Api/**/*.csproj

dotnet build ci-api.slnf -c Release

2 つ目はローカル開発です。大きなリポジトリはしばしば一握りの「スターター」フィルターを出荷して、新しいエンジニアがモバイルや docs のプロジェクトのロードを待たずに backend を開けるようにします。これらのフィルターを正確に保つには、以前はプロジェクト移動のたびに Visual Studio で個別に開く必要がありました - .sln のリネームは .slnf を自動更新しなかったからです。新しいコマンドを使えば、更新はワンライナーです:

dotnet sln backend.slnf remove src/Legacy/OldService.csproj
dotnet sln backend.slnf add src/Services/NewService.csproj

パスについての小さなメモ

dotnet sln はプロジェクトパスを呼び出し元ではなくフィルターからの相対で解決します。IDE の読み方と一致します。.slnfbuild/filters/ にあり、src/ のプロジェクトを指しているとき、保存されるパスは ..\..\src\Foo\Foo.csproj で、dotnet sln list も同じように表示します。別のワーキングディレクトリからフィルター編集をスクリプト化するときに覚えておく価値があります。

dotnet run -e によるインライン環境変数 と、以前の EF Core のシングルステップマイグレーション と組み合わせて、Preview 3 は「これをやるために Visual Studio を開かないと」のセットを削り続けています。完全なリストは .NET 11 Preview 3 SDK ノート にあります。

< 戻る