Как я могу построить проект с несколькими. net фреймворками для пакета nuget - PullRequest
0 голосов
/ 19 января 2020

Я разрабатываю проект на github и publi sh для nuget. При создании каждой версии мне приходится создавать несколько. net фреймворков и использовать эти dll для пакета nuget. Есть ли простой способ опубликовать sh все это. net версии фреймворка? Спасибо.

1 Ответ

2 голосов
/ 19 января 2020
  1. Совместимость с Target Framework Moniker (TFM)

Существует совместимость с TFM. Как правило, более низкие версии семейства TFM совместимы с более высокими версиями. Таким образом, сборка. NET Framework 4.7 может использоваться в проекте, предназначенном для проекта. NET Framework 4.7.1, 4.7.2 или 4.8. Точно так же, для целей проекта можно использовать пакет NuGet. NET Стандарт 1.2. NET Стандарт 2.0.

. NET Стандарт также особенный. Это не среда выполнения, это спецификация, которую реализуют среды выполнения. Точно так же, как документы на. NET Стандарт скажем, хотя. NET 4.6.1 был помечен как совместимый с. NET Стандарт 2.0 и ниже, есть проблемы, поэтому рекомендуется использовать на минимум. NET Framework 4.7.2 или 4.8 использует пакеты или ссылки на проекты для этой цели. NET Standard.

Наконец, между API существует большое перекрытие. NET Время выполнения ядра, netcoreapp и. NET Framework. Таким образом, несмотря на наличие несовместимости, чтобы позволить. NET базовым приложениям использовать пакеты NuGet, которые могут быть несовместимыми, NET Core SDK 2.0 ввел концепцию, известную как целевой откат. Если проект не совместим напрямую с пакетом, если пакет поддерживает один из целевых резервных TFM, NuGet разрешит это с предупреждением. Может произойти сбой во время выполнения, отсюда и предупреждение, но это может сработать. Это более важно для. NET Core 3.0, когда разработчики пишут настольные приложения в WPF и WinForms и хотят использовать. NET Framework NuGet-пакеты, обеспечивающие функциональность рабочего стола.

В итоге вам может не понадобиться создать пакет NuGet, предназначенный для нескольких TFM. Просто выберите самый низкий TFM, в котором есть нужные API, нацельтесь на него и позвольте совместимости TFM заставить его работать Однако, если вы хотите использовать API-интерфейсы, доступные только в более новых TFM, при этом поддерживая более старые TFM, вам нужно будет нацелить свой проект и пакет на несколько целей, но, опять же, вы можете минимизировать количество TFM, которое вам нужно поддерживать. Вашему пакету не нужны netstandard1.0, netstandard1.1, netstandard1.2, netstandard1.3, netstandard2.0 и netstandard2.1 TFM.

Использование проектов в стиле SDK

Предполагается, что вы разрабатываете с Visual Studio, установите рабочую нагрузку. NET Core, даже если вы не планируете выполнять кроссплатформенность (Linux, Ма c) развитие. С. NET Core файл проекта был изменен, чтобы быть значительно более простым, и в то же время намного более мощным, включая встроенную поддержку нацеливания на несколько TFM в одном файле проекта. Ранее было необходимо создать один csproj на TFM, который вы хотели в вашем пакете, скомпилировать каждый проект, а затем nuspec, который перетянет все в нужное место. Теперь просто используйте один csproj, в котором перечислены все TFM, на которые вы хотите нацелиться, и запустите dotnet pack (не создавайте nuspe c, метаданные пакета, полученные из свойств MSBuild ).

Итак, когда у вас установлен. NET Core SDK, вы можете создать стандартную библиотеку классов. NET из Visual Studio или запустить dotnet new classlib в командной строке. Неважно, хотите ли вы нацелиться на. NET Framework, создайте. NET Стандартную библиотеку классов, потому что именно так вы получаете проект в стиле SDK. Шаблон проекта библиотеки классов. NET Framework использует проект не в стиле SDK, который не поддерживает многоцелевой таргетинг. Затем отредактируйте csproj и измените <TargetFramework>netstandard2.0</TargetFramework> на <TargetFrameworks>net472;netstandard2.0</TargetFrameworks>. Обратите внимание, что TargetFramework (единственное число) стало TargetFrameworks (множественное число), а содержимое элемента XML представляет собой разделенный точкой с запятой список TFM, для которых вы хотите, чтобы ваш проект предназначался для ).

Вот полный пример csproj, с которого вы можете начать:

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

  <PropertyGroup>
    <TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
  </PropertyGroup>

</Project>

Как уже говорилось ранее, если у вас есть csproj, который выглядит следующим образом, просто запустите dotnet pack из командной строки (Вы также можете щелкнуть правой кнопкой мыши по проекту в обозревателе решений Visual Studio и выбрать «Пакет»), и вы получите nupkg, который скомпилировал сборки net472 и netstandard2.0 в правильных местах пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...