创建 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 特定的打包命令,因为 AOT 编译会生成原生二进制文件。 有关本机 AOT 编译所需的先决条件的更多信息,请参阅 本机 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 工具

创建一个特定于 RID 且经过 AOT 编译的工具的完整示例如下:

  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。

另请参阅