Мультитаргетинг NuGet-Пакетов
При создании NuGet-пакета мы хотели бы использовать минимально возможную версию платформы (чтобы обеспечить максимальный охват), но также пользоваться преимуществами новейших функций dotnet. Используя мультитаргетинг, мы можем одновременно поддерживать разные версии платформы.
1. Проект
Для начала в файл проекта добавим нужные нам версии:
<Project>2. Код, зависимый от платформы
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
…
</PropertyGroup>
</Project>
В .NET 8 добавлен новый тип коллекции — FrozenSet. Попробуем его использовать.
Этого можно достичь с помощью условных директив компилятора:
private static readonly IReadOnlySet<Hamburger> AllItems;3. Внешние зависимости
static Hamburger()
{
#if NET8_0_OR_GREATER
AllItems = new HashSet<Hamburger>()
{
…
}.ToFrozenSet();
#else
AllItems = new HashSet<Hamburger>()
{
…
};
#endif
}
Нам бы хотелось использовать разные версии внешних зависимостей в зависимости от используемой версии платформы. Например, в .NET 7 - версию 7 EF Core, а в .NET 8 – превью версии 8.
* Здесь мы используем централизованное управление пакетами.
<Project>При сборке проекта для net7.0 используются зависимости, специфичные для .NET 7, и аналогично для .NET 8.
<PropertyGroup>
<ManagePackageVersionsCentrally>
true
</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<!-- общие зависимости -->
<PackageVersion Include="BenchmarkDotNet" Version="0.13.7"/>
…
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="7.0.10"/>
…
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.0-preview.7.23375.4"/>
…
</ItemGroup>
…
</Project>
4. Сборка и публикация пакетов
В GitHub Actions единственное, что будет отличаться от обычного скрипта, это то, что вам необходимо убедиться, что вы указали все платформы, которые вы поддерживаете, на этапе настройки dotnet.
steps:Больше ничего менять не надо, просто выполняйте
…
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
7.0.400
8.0.x
dotnet-quality: 'preview'
…
dotnet build, dotnet pack и dotnet publish, как обычно.Источник: https://josef.codes/multi-targeting-your-nuget-packages/