本文適用於: ✔️.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 屬性
或者,使用 ToolPackageRuntimeIdentifiers 進行工具特定的 RID 配置:
<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 一次:
dotnet pack
此指令會建立多個 NuGet 套件:
- 每個RID一個包:
<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
- 範例:
- 一個與 RID 無關的指標套件:
<packageName>.<packageVersion>.nupkg- 範例:
mytool.1.0.0.nupkg
- 範例:
AOT 工具
對於具備AOT編譯的工具(<PublishAot>true</PublishAot>),必須分別為每個平台打包:
打包一次頂層套件(在任何平台):
dotnet pack針對對應平台上的每個特定RID進行打包:
dotnet pack -r win-x64 dotnet pack -r linux-x64 dotnet pack -r osx-arm64你必須在匹配平台上執行每個 RID 專屬的 pack 指令,因為 AOT 編譯會產生原生二進位檔。 欲了解更多關於 Native AOT 編譯的前置條件,請參見 Native AOT 部署。
封裝結構
套件類型
RID 專用工具套件使用兩種套件類型:
- DotnetTool:包含元資料的頂層套件。
- DotnetToolRidPackage:包含實際工具二進位檔的 RID 專用套件。
套件中繼資料
頂層套件包含中繼資料,標示它是 RID 專用工具,並列出 RID 專用套件。 當你執行 dotnet tool install時,CLI 會讀取這些元資料,以決定要安裝哪個 RID 專屬套件以適用於目前平台。
發佈你的工具
使用 dotnet nuget push 將所有套件發佈到 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.csConsole.WriteLine("Hello from MyFastTool!"); Console.WriteLine($"Running on {Environment.OSVersion}");打包頂級套件:
dotnet pack針對每個特定RID(在對應平台上)的包裝:
在 Windows 上:
dotnet pack -r win-x64在 Linux 上:
dotnet pack -r linux-x64在 macOS 上:
dotnet pack -r osx-arm64使用 dotnet nuget push 指令將所有套件發佈給 NuGet.org。