Добавление пакетов Microsoft. * NuGet в библиотеку классов с несколькими таргетингами - PullRequest
0 голосов
/ 18 марта 2020

Как все мы знаем, пакеты Microsoft. * NuGet должны быть добавлены в проект путем сопоставления номера основной и вспомогательной версии с версией вашего. NET Базового проекта. Например, если бы я добавил Microsoft.Extensions.Logging в свой проект. NET Core 2.1, я бы использовал версию 2.1.1, но не 2.2.0.

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

Предположим, моя библиотека предназначена для netstandard2.0, netcoreapp2.1 и netcoreapp2.2. Прежде всего: действительно ли моя библиотека должна нацеливаться на каждую поддерживаемую инфраструктуру netcoreapp явно? Я делал это, чтобы иметь возможность указать другую требуемую версию для пакетов Microsoft. *, Но я не уверен это необходимо . Вот что я обычно делаю:

<PackageReference Include="Microsoft.Extensions.Logging" Version="[2.1.1, 2.2)" Condition="'$(TargetFramework)' == 'netcoreapp2.1'" />
<PackageReference Include="Microsoft.Extensions.Options" Version="[2.1.1, 2.2)" Condition="'$(TargetFramework)' == 'netcoreapp2.1'" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="[2.2.0, 3)" Condition="'$(TargetFramework)' == 'netcoreapp2.2'" />
<PackageReference Include="Microsoft.Extensions.Options" Version="[2.2.0, 3)" Condition="'$(TargetFramework)' == 'netcoreapp2.2'" />

В некоторых проектах я смог сгруппировать PackageReference в несколько ItemGroup и применить Condition к ItemGroup чем для каждого отдельного человека PackageReference, что является более кратким и ясным, но есть один конкретный проект, для которого этот метод не работает (он рассматривается, как если бы он не имел никакой зависимости). Я не знаю почему - я думаю, это заслуживает другого вопроса.

В любом случае, этот подход исключает цель netstandard2.0, что означает, что мне нужно go через мой код и добавить #if NETCOREAPP вокруг любого вызова регистратора или подобных классов. Но я не могу ссылаться на пакет, потому что я не уверен, на какую версию пакета я должен ссылаться при нацеливании на netstandard2.0.

В нескольких проектах я отбросил Condition s и позволил любой цели использовать самую низкую версию, которая мне была нужна:

<PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="2.1.1" />

Гораздо проще для глаз :) С одной стороны, Я думаю, что он должен работать, потому что «основной» проект в конечном итоге будет ссылаться, скажем, на версию 2.2. *, А моей библиотеке требуется 2.1.1 или более поздняя версия , поэтому в конце должна использоваться версия 2.2. *. С другой стороны, иногда я получаю сообщение об ошибке конфликта версий, которое предполагает, что это на самом деле не работает. В конце концов, я боюсь, что я могу использовать версию 2.1.1 в своих вызовах библиотеки, хотя я работаю над проектом netcoreapp2.2, который использует версию 2.2. * Этой зависимости, которая может привести к сборке конфликт версий или, что еще хуже, ошибки во время выполнения.

Каков правильный подход при обращении к пакетам Microsoft. * В библиотеке многоцелевого назначения? Нужно ли явно выбирать версию для каждой цели? Что мне выбрать для netstandard2.0? Должно ли это быть изменено, когда я решу поддерживать netcoreapp3.0 или netcoreapp3.1?

...