この記事の対象: ✔️ .NET SDK 10 以降のバージョン
ネイティブ、高速、トリミングされたアプリケーションを配布できるように、特定のプラットフォームとアーキテクチャ用の .NET ツールをパッケージ化します。 この機能により、MCP サーバーやその他のプラットフォーム固有のユーティリティなどのコマンド ライン ツール用に、ネイティブで高速でトリミングされた .NET アプリケーションを簡単に配布できます。
概要
.NET SDK 10 以降では、特定のランタイム識別子 (RID) を対象とする .NET ツールを作成できます。 次のツールを使用できます。
- RID 固有: 特定のオペレーティング システムとアーキテクチャ用にコンパイルされます。
- 自己完結型: .NET ランタイムを含めます。個別の .NET インストールは必要ありません。
- ネイティブ AOT: 事前コンパイルを使用して、起動時間を短縮し、メモリ占有領域を小さくします。
ユーザーが RID 固有のツールをインストールすると、.NET CLI によってプラットフォームに適したパッケージが自動的に選択されてインストールされます。
RID 固有のパッケージ化にオプトインする
RID 固有のツールを作成するには、次のいずれかの MSBuild プロパティを使用してプロジェクトを構成します。
RuntimeIdentifiers プロパティ
RuntimeIdentifiersを使用して、ツールでサポートされるプラットフォームを指定します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<PackAsTool>true</PackAsTool>
<ToolCommandName>mytool</ToolCommandName>
<RuntimeIdentifiers>win-x64;linux-x64;osx-arm64</RuntimeIdentifiers>
</PropertyGroup>
</Project>
ToolPackageRuntimeIdentifiers プロパティ
または、ツール固有の RID 構成に ToolPackageRuntimeIdentifiers を使用します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<PackAsTool>true</PackAsTool>
<ToolCommandName>mytool</ToolCommandName>
<ToolPackageRuntimeIdentifiers>win-x64;linux-x64;osx-arm64</ToolPackageRuntimeIdentifiers>
</PropertyGroup>
</Project>
RID 値のセミコロン区切りのリストを使用します。 ランタイム識別子の一覧については、 RID カタログを参照してください。
ツールをパッケージ化する
パッケージ化プロセスは、AOT コンパイルを使用しているかどうかによって異なります。 プロジェクトから NuGet パッケージまたは .nupkg ファイルをビルドするには、 dotnet pack コマンドを実行します。
RID に特有の自己完結型ツール
AOT コンパイルのないツールの場合は、 dotnet pack を 1 回実行します。
dotnet pack
このコマンドは、複数の NuGet パッケージを作成します。
- RID ごとに 1 つのパッケージ:
<packageName>.<RID>.<packageVersion>.nupkg- 例:
mytool.win-x64.1.0.0.nupkg - 例:
mytool.linux-x64.1.0.0.nupkg - 例:
mytool.osx-arm64.1.0.0.nupkg
- 例:
- 1 つの RID に依存しないポインター パッケージ:
<packageName>.<packageVersion>.nupkg- 例:
mytool.1.0.0.nupkg
- 例:
AOT ツール
AOT コンパイル (<PublishAot>true</PublishAot>) を使用するツールの場合は、プラットフォームごとに個別にパックする必要があります。
最上位レベルのパッケージを 1 回 (任意のプラットフォームで) パックします。
dotnet pack対応するプラットフォーム上の特定の RID ごとにパックします。
dotnet pack -r win-x64 dotnet pack -r linux-x64 dotnet pack -r osx-arm64AOT コンパイルではネイティブ バイナリが生成されるため、対応するプラットフォームで各 RID 固有のパック コマンドを実行する必要があります。 ネイティブ AOT コンパイルの前提条件の詳細については、「 ネイティブ AOT のデプロイ」を参照してください。
パッケージ構造
パッケージの種類
RID 固有のツール パッケージでは、次の 2 種類のパッケージが使用されます。
- DotnetTool: メタデータを含む最上位レベルのパッケージ。
- DotnetToolRidPackage: 実際のツール バイナリを含む RID 固有のパッケージ。
パッケージ メタデータ
最上位のパッケージには、RID 固有のツールであることを示すメタデータが含まれており、RID 固有のパッケージが一覧表示されます。
dotnet tool installを実行すると、CLI はこのメタデータを読み取り、現在のプラットフォーム用にインストールする RID 固有のパッケージを決定します。
ツールを公開する
dotnet nuget プッシュを使用して、すべてのパッケージを NuGet.org またはパッケージ フィードに発行します。
dotnet nuget push path/to/package/root/*.nupkg
RID 固有のツールを実行する
ユーザーは、プラットフォームに依存しないツールと同じ方法で RID 固有のツールを実行します。
dnx mytool
CLI は自動的に次の手順を実行します。
- 最上位レベルのパッケージをダウンロードします。
- RID 固有のメタデータを読み取ります。
- 現在のプラットフォームに最適なパッケージを識別します。
- RID 固有のパッケージをダウンロードして実行します。
例: AOT ツールを作成する
AOT コンパイル RID 固有のツールを作成する完全な例を次に示します。
新しいコンソール アプリケーションを作成します。
dotnet new console -n MyFastTool cd MyFastToolプロジェクト ファイルを更新して、AOT および RID 固有のパッケージ化を有効にします。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net10.0</TargetFramework> <PackAsTool>true</PackAsTool> <ToolCommandName>myfasttool</ToolCommandName> <RuntimeIdentifiers>win-x64;linux-x64;osx-arm64</RuntimeIdentifiers> <PublishAot>true</PublishAot> <PackageId>MyFastTool</PackageId> <Version>1.0.0</Version> <Authors>Your Name</Authors> <Description>A fast AOT-compiled tool</Description> </PropertyGroup> </Project>Program.csにアプリケーション コードを追加します。Console.WriteLine("Hello from MyFastTool!"); Console.WriteLine($"Running on {Environment.OSVersion}");最上位レベルのパッケージをパックします。
dotnet pack(対応するプラットフォーム上の) 特定の RID ごとにパックします。
Windows の場合:
dotnet pack -r win-x64Linux の場合:
dotnet pack -r linux-x64macOS の場合:
dotnet pack -r osx-arm64dotnet nuget push コマンドを使用して、すべてのパッケージを NuGet.org に発行します。
こちらも参照ください
.NET