本文适用于: ✔️.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会自动执行以下操作:
- 下载最高级别的包。
- 读取 RID 特定的元数据。
- 标识适用于当前平台的最合适的包。
- 下载并运行特定于 RID 的包。
示例:创建 AOT 工具
创建一个特定于 RID 且经过 AOT 编译的工具的完整示例如下:
创建新的控制台应用程序:
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-x64在 Linux 上:
dotnet pack -r linux-x64在 macOS 上:
dotnet pack -r osx-arm64使用 dotnet nuget push 命令将所有包发布到 NuGet.org。