Каковы различия между Microsoft.NET.Sdk и Microsoft.NET.Sdk.Web - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть решение с двумя хост-проектами (один - Web Host , а другой - Generic Host ) и проектом библиотеки классов, на который ссылаются эти два хост-проекта.

В атрибуте Sdk корневого тега <Project> файла * .csproj оба проекта хоста (веб-хост и универсальный хост) используют Microsoft.NET.Sdk.Web, но проект библиотеки классовиспользует Microsoft.NET.Sdk.

Два хост-проекта ссылаются на метапакет Microsoft.AspNetCore.App.

В проекте библиотеки классов используется Microsoft.NETCore.App, но он ссылается на некоторые пакеты ASP.NET Core по отдельности (пакеты Microsoft.AspNetCore.App, которых нет в Microsoft.NETCore.App).

О правильном SDK и метапакетах:

1) В общем проекте хоста следует использовать чистый .NETCore (Microsoft.NET.Sdk и Microsoft.NETCore.App) вместо ASP.NET Core (Microsoft.NET.Sdk.Web и Microsoft.AspNetCore.App), поскольку это не веб-проект?

2)В проекте библиотеки классов нормально использовать Microsoft.NET.Sdk с Microsoft.AspNetCore.App, чтобы избежать возможности ссылаться на другую версиюs пакетов, которые принадлежат Microsoft.AspNetCore.App (чтобы избежать, например, Microsoft.AspNetCore.App@2.1.0 в хост-проекте и Microsoft.Extensions.Configuration@2.0.0 в проекте библиотеки классов)?Или я могу использовать Microsoft.AspNetCore.App metapackage только с Microsoft.NET.Sdk.Web SDK?

3) Какая разница, использовать Microsoft.NET.Sdk или Microsoft.NET.Sdk.Web? docs говорит, что "SDK, как описывает многоуровневый документ, представляет собой набор задач и целей MSBuild, которые могут создавать код .NET Core." , но зачем наместь оба из них?На практике, что Microsoft.NET.Sdk.Web делает, что Microsoft.NET.Sdk не делает?

1 Ответ

0 голосов
/ 22 сентября 2018

Объявление (1) и (3): в чем различия между «базовым» и веб-SDK, как они влияют на типовые хост-приложения?

Наиболее важные различия:

  1. Элементы по умолчанию

    Веб-SDK имеет различные определения и шаблоны глобализации, для которых файлы необходимо включить в опубликованное приложение.

    Например, когда выЕсли у вас есть файл appsettings.json, проекты, использующие веб-SDK, будут автоматически включать его, поскольку существуют шаблоны, которые гарантируют, что файлы .config, .json и все файлы в папке wwwroot являются частью выходных данных публикации.См. исходный код MSBuild на GitHub для этих шаблонов .

    Если у вас общий хост и вы не используете Web SDK, вам может потребоваться добавить код в файл csproj, чтобы указатькакие файлы копировать в каталог публикации (или использовать IDE для изменения параметра «копировать в каталог вывода», который также включает файлы в вывод публикации, но также копирует их в вывод сборки):

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    
  2. Логика веб-публикации

    Еще одной важной частью Web SDK является то, что он содержит логику развертывания для веб-приложений.

    Если вы планируетеиспользуйте профили публикации (.pubxml файлы) или внедрите их в Azure или файловые системы с помощью MSBuild / MSDeploy, вам понадобится эта логика публикации.

Ad (2): какой SDK использовать для классабиблиотеки?

Для максимальной совместимости при публикации публичных библиотек (например, через NuGet) используйте базовый SDK и ссылайтесь на отдельные пакеты с минимально возможной версией - например, 2.1.0 / 2.1.1.

Если вы разрабатываете библиотеку классов, содержащую бритвенные представления, вам нужно использовать Microsoft.NET.Sdk.Razor SDK для получения бритвенных инструментов (например, при использовании шаблона dotnet new razorclasslib).

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

Для инструментов ASP.NET Core 2.1 (!) (CLI 2.1. *)Я предлагаю использовать не-веб-SDK для библиотек классов и использовать версию 2.1.1 этого пакета.Никогда не обновляйте его, даже если NuGet предлагает вам обновление.

Для тестовых проектов с инструментами 2.1 (!) (CLI 2.1. *), Это немного по-другому и сложно, см. Интеграцияи модульные тесты больше не работают на ASP.NET Core 2.1, который не может найти сборки во время выполнения

Начиная с версии 2.2 (CLI 2.2.100+), пакет без версии ссылается на ASP.NET Coreметапакеты перемещаются в базовый SDK, поэтому вы можете разрабатывать библиотеки и тестировать проекты для ASP.NET Core 2.1 и 2.2 с помощью «core» SDK (при условии, что вы используете инструменты 2.2.100+) с использованием ссылок на пакеты без версии:

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

В .NET Core / ASP.NET Core 3.0 вы сможете ссылаться на каркас с помощью нового механизма (веб-SDK не требуется):

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...