共用方式為


建立專為資源識別碼(RID)設計的、自成一體的 AOT .NET 工具

本文適用於: ✔️.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 自動地:

  1. 下載高階套件。
  2. 讀取 RID 專屬的元資料。
  3. 找出最適合當前平台的套件。
  4. 下載並執行 RID 專用套件。

範例:建立一個AOT工具

以下是建立AOT編譯專用RID工具的完整範例:

  1. 建立新的主控台應用程式:

    dotnet new console -n MyFastTool
    cd MyFastTool
    
  2. 更新專案檔案以啟用 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>
    
  3. 請將您的申請代碼輸入:Program.cs

    Console.WriteLine("Hello from MyFastTool!");
    Console.WriteLine($"Running on {Environment.OSVersion}");
    
  4. 打包頂級套件:

    dotnet pack
    
  5. 針對每個特定RID(在對應平台上)的包裝:

    在 Windows 上:

    dotnet pack -r win-x64
    

    在 Linux 上:

    dotnet pack -r linux-x64
    

    在 macOS 上:

    dotnet pack -r osx-arm64
    
  6. 使用 dotnet nuget push 指令將所有套件發佈給 NuGet.org。

另請參閱