TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #2073 1.99K
День 1706. #ЗаметкиНаПолях
Мультитаргетинг NuGet-Пакетов
При создании NuGet-пакета мы хотели бы использовать минимально возможную версию платформы (чтобы обеспечить максимальный охват), но также пользоваться преимуществами новейших функций dotnet. Используя мультитаргетинг, мы можем одновременно поддерживать разные версии платформы.

1. Проект
Для начала в файл проекта добавим нужные нам версии:
<Project>
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
…
</PropertyGroup>
</Project>

2. Код, зависимый от платформы
В .NET 8 добавлен новый тип коллекции — FrozenSet. Попробуем его использовать.
Этого можно достичь с помощью условных директив компилятора:
private static readonly IReadOnlySet<Hamburger> AllItems;

static Hamburger()
{
#if NET8_0_OR_GREATER
AllItems = new HashSet<Hamburger>()
{
…
}.ToFrozenSet();
#else
AllItems = new HashSet<Hamburger>()
{
…
};
#endif
}

3. Внешние зависимости
Нам бы хотелось использовать разные версии внешних зависимостей в зависимости от используемой версии платформы. Например, в .NET 7 - версию 7 EF Core, а в .NET 8 – превью версии 8.
* Здесь мы используем централизованное управление пакетами.
<Project>
<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>

При сборке проекта для net7.0 используются зависимости, специфичные для .NET 7, и аналогично для .NET 8.

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/
  • 👍 10
More from @netdeveloperdiary
  1. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  2. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
  3. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  4. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  5. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  6. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →