Какие версии .NET должны поддерживаться пакетами NuGet, чтобы максимизировать их доступность и функциональность?

TL; DR:


Мысли (старая версия):

Пакеты NuGet поддерживают несколько версий и профилей .NET Framework , например, пакет может предоставлять версии net20, net30, net35, net40, net45, sl3, sl4, sl5 и т. Д. Однако, если предположить, что в функциональности пакета не всегда есть различия , предоставление большого количества версий будет пустой тратой времени сборки и размера пакета и вызовет излишнюю сложность. С другой стороны, предоставление пакета только для самой поддерживаемой версии Framework может привести к отсутствию функциональности, например .NET 4 поддерживает одновременное выполнение нескольких версий CLR на стороне, но в предыдущих версиях этого нет, поэтому эта функция будет потеряна, если будет предоставлена ​​только версия для .NET 3.5 (я не уверен, я никогда не использовал ее и не знаю деталей). Если предоставляется версия PCL, логика проста, я предполагаю: просто исключите версии, которые покрывает PCL.

    На момент написания статьи проще всего создать проект .NET Standard 1.1 . Он поддерживает

    • .NET Core 1.0 и выше
    • .NET Framework 4.5 и выше
    • Моно, Xamarin, Windows Phone и многое другое …

    Так что почти все современные платформы. Если вы хотите поддерживать старые платформы, например. .NET Framework 3.0, добавьте это как отдельную «папку» в NuGet. Таким образом, новые приложения .NET Core все еще могут использовать ваш пакет.


    Дополнительная информация

    .NET Standard выполняет замену PCL . Самая низкая платформа .NET Framework, с которой вы можете настроить PCL, составляет 4.0, что не намного ниже 4.5 с .NET Standard 1.1 (таким образом, ваш пакет не станет более доступным).

    PCL также, похоже, не поддерживает .NET Core, в то время как .NET Standard почти поддерживает все платформы: Таблица поддержки стандарта .NET

    Также обратите внимание, что в соответствии с Microsoft в настоящее время поддерживаются только .NET Framework 3.5 SP1 и .NET Framework> = 4.5.2 . Все другие версии .NET Framework уже достигли конца жизни и не получат никаких обновлений. Windows Phone также мертв, а Silverlight тоже не доходит.

    Как отмечает @Lex Li в комментариях, .NET Standard 1.1 имеет очень низкую поверхность API, что означает, что, возможно, некоторые важные API отсутствуют. Из-за этого в большинстве пакетов NuGet используется более высокая стандартная версия .NET. Рекомендуется использовать минимальную версию .NET Standard.

    Таким образом, с .NET Standard 1.1 вы будете поддерживать огромное большинство современных фреймворков. К сожалению, я не нашел никакой статистики распространения .NET Framework …


    Если вы действительно хотите сделать свой пакет доступным для каждой платформы , взгляните на возможные целевые платформы для NuGet . Я думаю, вам нужно net11 и netstandard1.0 , возможно, добавить поддержку Silverlight и .NET MicroFramework …

    Решение 2018 года

    Основываясь на данных атрибутах и ​​не предполагая зависимости от технологий, специфичных для платформы (например, System.Drawing, ASP.NET или WPF, и в этом случае просто нацеливайте платформу, которую вы можете и с ней делать):

    1. netstandard1.0netstandard2.0 Начните с .NET Standard 1.0 и дойдете до максимальной функциональности.

      Это должно охватывать:

      • .NET Framework 4.5
      • .NET Core 1.0
      • Моно 4.6
      • Xamarin.iOS 10.0
      • Xamarin.Android 7.0
      • Windows Universal 10.0
      • Windows non-Universal 8.0 (до .NET Standard 1.2)
      • Windows Phone 8.1 (до .NET Standard 1.2)
      • Windows Phone Silverlight 8.0 (до .NET Standard 1.0)

      Если вы не можете разумно реализовать библиотеку в рамках относительно небольшого .NET Standard 1.0-1.2, последние три пункта, вероятно, будут исключены. Если вы все еще нуждаетесь в них, см. Пункты ниже.

      .NET Standard 1.5+ повышает требования к версиям фреймворков и операционных систем, поэтому для максимальной совместимости могут потребоваться версии с несколькими стандартами .NET Standard.

    2. portable-net40+* Следующим важным моментом является устаревший PCL. Его версии .NET Framework 4.5+ не актуальны, поскольку они в основном покрыты стандартом .NET. Если вы хотите поддерживать Windows Phone 8 и не универсальный Windows Store 8, вы должны сделать это через PCL, если только вы не ограничены API, и в этом случае вам придется добавлять целевые платформы.

      Если вам не нужны какие-либо дополнительные платформы, а .NET Framework 4.0 предоставляет некоторые полезные дополнительные функции для .NET 3.5, вы можете настроить таргетинг непосредственно, а не через PCL.

      Это должно охватывать:

      • .NET Framework 4.0
      • Windows non-Universal 8.0
      • Windows Phone 8.0
      • Windows Phone Silverlight 8.0
    3. net20net35 Если вы хотите поддерживать net35 настольные версии Windows (например, Windows XP) и не обновленные более поздние версии Windows (например, Windows Vista + с .NET 3.0+), вы должны добавить поддержку для настольных целей .NET Framework напрямую. Обратите внимание, что с 2018-01-01 самый низкий поддерживаемый .NET составляет 3.5 SP1, поэтому он будет ниже, чем это, вероятно, не нужно и, скорее всего, ограничит ansible вам API без каких-либо реальных преимуществ.

      Это должно охватывать:

      • .NET Framework 2.0-3.5
      • Windows XP
    4. Существуют и другие платформы, а именно Xamarin-специфичные, Tizen, .NET Micro и т. Д. К ним можно получить доступ, только нацелив их непосредственно.

      Это должно охватывать:

      • Все остальное

    TL; DR

    Что-то вроде netstandard1.1 + portable-net40+win8 + net35 охватывает каждую соответствующую платформу.

    Решение будущего

    Когда старые версии .NET полностью умирают, должен оставаться только стандарт .NET. Ну, если Microsoft не изобретает еще одну технологию межплатформенной унификации, как это уже делали с .NET, .NET PCL, .NET Standard …

    TL; DR

    Используйте наименьший netstandard вы можете.

    Вы должны настроить таргетинг на .net framework 2.0 и выше. Решение должно основываться на платформе, на которой приложение будет работать в процессе производства. .net 2.0 входит в состав сервера Windows 2008 (SP2 и далее), и люди по-прежнему широко используют его в производстве. Ref https://en.wikipedia.org/wiki/.NET_Framework

    Если вы хотите, чтобы он использовался не только для Windows – .NET Standard – это путь. Задача последней – вопрос о том, какие библиотеки использовать в начале проекта и редко пересматривается, а новые проекты, как правило, используют последние версии фреймворков и библиотек.

    • Какие версии .NET Standard поддерживаются версиями других фреймворков (GitHub).

    • Какие версии .NET Framework поддерживаются версиями Windows Server (MS Docs).

    • Доля версии сервера в сети SpiceWork . Это не представление глобальных данных , но это лучшие данные, которые я нашел, чтобы получить представление о доле рынка Windows Server.

    • Информация о возможностях Linux для версий .NET Core (MS Docs).

    Вы можете легко найти последние доли рынка пользовательских устройств на основе использования Интернета.

    См. Номера, выберите платформы, которые вы хотите охватить, и перекрестно ссылайтесь на них, какие версии .NET доступны на них.

    Таргетинг .Net Standard предоставит вашему пакету nuget роскошь быть доступным в .NET framework, .NET core, mono, Xamarin, Universal Windows Platform и Windows Phone.

    См. Следующее взятое из этого ответа

    .Net стандарт

    Чтобы решить, какую версию стандарта .Net вы должны использовать, используйте следующую таблицу:

    .net стандартная таблица поддержки

    Источник .

    Если посмотреть на приведенную выше таблицу, я бы порекомендовал использовать стандарт .Net 1.0, если вам не нравится Windows Phone Silverlight или .Net standard 1.2, если вы этого не сделаете.

    Кроме того, насколько я заметил, многие люди, которые выбрали kernel ​​.net, фактически используют .net core 2.0, поэтому вам может понадобиться создать отдельную версию nuget для них с .net standard 2.0.

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

    Еще одна вещь, которую я хотел бы принять во внимание, – это распространенные используемые библиотеки, такие как Masstransit , EPPlus и широко используемые IOC и т. Д. Я бы взглянул в общих чертах на поддерживаемые ими frameworks и следил за тем, что многие проходящие проекты могут быть вызваны таких библиотек.