Microsoft.Extensions. * Версия путаницы - PullRequest
3 голосов
/ 02 октября 2019

У меня есть библиотека, нацеленная на netstandard2.0, которую я использую в ASP.NET Core 2.2 приложении, которое использует пару Microsoft.Extensions пакетов

Вот мой csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.2.0" />
  </ItemGroup>

</Project>

Теперь я хочу иметь возможность использовать эту же библиотеку в новом приложении ASP.NET Core 3, а также в моих существующих приложениях ASP.NET Core 2.2.

Глядя на пакеты Microsoft.Extensions.*, их версии всегда соответствуютверсии выпуска ASP.NET Core.

Мои варианты

  • Ничего не делать .. Будет ли этот пакет работать в приложении ASP.NET Core 3?
  • Обновить пакетыдо их 3.0 эквивалентов. Будет ли этот пакет работать в приложении ASP.NET Core 2?
  • Сохранить существующий пакет (для приложений ASP.NET Core 2.2), но создать новый пакет, используя эквиваленты 3.0 дляиспользование в ASP.NET Core 3.0 приложениях

Общий вопрос как автора библиотеки, какова взаимосвязь между конкретной версией пакета Microsoft.Extensions.* и его использованием в конкретной цели ASP.NET Core?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

со ссылкой на ваши параметры:

Ничего не делать .. Будет ли этот пакет работать в приложении ASP.NET Core 3?

Не могу дать точноеответ, это зависит от доступности классов в целевой структуре, вы можете проверить .NET API Browser для всех версий .NET

Обновите пакеты до их 3.0 эквивалентов. Будет ли этот пакет работать в приложении ASP.NET Core 2?

Нет, когда вы нацеливаетесь на более высокую версию, он также попытается установить все связанные зависимости из более высокой версии каркаса, и это будеточень запутанно.

Сохраните существующий пакет (для приложений ASP.NET Core 2.2), но создайте новый пакет, используя эквиваленты 3.0 для использования в приложениях ASP.NET Core 3.0

Это может решить проблему, но это не практическое решение, вы удвоите работу, когда работаете над любыми обновлениями.

Как уже упоминалось в предыдущем комментарии, вы можете сделать multiple target nuget package (рассмотрите эту опцию, только если вам нужны специфичные для фреймворка зависимости)

@ Tseng уже объяснил условный таргетинг, я добавлю только таргетинг для .NET Core 3, так как большая часть nugetпакеты уже включены в базовую платформу 3 , вам может понадобиться только добавить ссылку на платформу, как показано ниже:

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
    <FrameworkReference Include="Microsoft.AspNetCore.App" Version="3.0.0" Exclude="Build,Analyzers" />
</ItemGroup>
0 голосов
/ 02 октября 2019

Вы можете (и должны) делать многоцелевой таргетинг.

Target netstandard2.0 и netstandard2.1, для netstandard2.0 ссылка на 2.x (самый низкий, который работает для вас, проб 2.0, не должно быть никаких критических изменений в 2.x) и для netstandard2.1 ссылаться на версии 3.x.

Почему?

Поскольку это основной скачок версии, обычно заканчивающийся новым apis, удалением старых или изменением сигнатур методов (другими словами: внесение изменений) и поскольку netstandard2.1 требует .NET Core 3.0, поэтому и приложения, ссылающиеся на него, полагаются на поверхность APi Microsoft.Extensions.* 3.x версии

Чтобы условно ссылаться на пакет, выполните

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
     <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0"/>
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' ">
     <PackageReference Include="Microsoft.Extensions.Logging" Version="3.0"/>
</ItemGroup>

В качестве альтернативы

<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0" Condition=" '$(TargetFramework)' == 'netstandard2.01' "/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0" Condition=" '$(TargetFramework)' == 'netstandard2.1' "/>

тоже работает, но менее читабельно. При этом все равно будет создан один NugetPackage, но в нем будут две папки netstandard2.0 и netstandard2.1 с двумя отдельно скомпилированными сборками, ориентированными на разные версии.

Когда этот пакет восстанавливается в .NET Core 3, он будет использовать версию netstandard2.1, а при восстановлении в .NET Core 2.x он будет использовать netstandard2.0.

Если естьРазличаются API, вы должны использовать директивы препроцессора в вашем коде

#if NETSTANDARD2_0
    // API call of 2.x library
#elif NETSTANDARD2_1
    // Api call of 3.x library
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...