Поделиться через


Создание RID-специфических, автономных средств и средств AOT .NET

Эта статья применяется к: ✔️ SDK для .NET 10 и более поздним версиям

Упаковывайте средства .NET для конкретных платформ и архитектур, чтобы распространять нативные, быстрые и оптимизированные приложения. Эта возможность упрощает распространение собственных, быстрых и обрезаемых приложений .NET для инструментов командной строки, таких как серверы MCP или другие служебные программы для конкретной платформы.

Обзор

Начиная с пакета SDK для .NET 10, можно создать средства .NET, предназначенные для определенных идентификаторов среды выполнения (RID). Эти средства могут быть следующими:

  • Специфичный параметр RID: скомпилирован для определенных операционных систем и архитектур.
  • Автономно: Включает среду выполнения .NET и не требует отдельной установки .NET.
  • Собственный AOT: используйте компиляцию авансом для ускорения запуска и уменьшения использования памяти.

Когда пользователи устанавливают средство, специфичное для RID, интерфейс командной строки .NET автоматически выбирает и устанавливает соответствующий пакет для их платформы.

Переход на специфическую для 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.

Упакуйте ваш инструмент

Процесс упаковки отличается в зависимости от того, используется ли компиляция 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 создает собственные двоичные файлы. Дополнительные сведения о предварительных требованиях для компиляции Native AOT см. в разделе развертывание Native AOT.

Структура пакета

Типы пакетов

Пакеты инструментов, относящиеся к RID, используют два типа пакетов:

  • DotnetTool: пакет верхнего уровня, содержащий метаданные.
  • DotnetToolRidPackage: пакеты, специфичные для RID, содержащие двоичные файлы инструментов.

Метаданные пакета

Пакет верхнего уровня включает метаданные, которые сигнализируют о том, что это инструмент, зависящий от RID, и содержит список пакетов, специфичных для RID. При запуске dotnet tool installинтерфейс командной строки считывает эти метаданные, чтобы определить, какой пакет, зависящий от RID, необходимо установить для текущей платформы.

Опубликуйте ваш инструмент

Опубликуйте все пакеты на NuGet.org или в канале пакетов с помощью команды dotnet nuget push.

dotnet nuget push path/to/package/root/*.nupkg

Запустите инструмент, предназначенный для RID

Пользователи запускают средства, относящиеся к RID, так же, как и средства, не зависящие от платформы:

dnx mytool

Интерфейс командной строки автоматически:

  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. Опубликовать все пакеты на NuGet.org, используя команду dotnet nuget push.

См. также