Как все мы знаем, пакеты 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?