Каковы различия между Microsoft.NET.Sdk и Microsoft.NET.Sdk.Web

76
11

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

В атрибуте 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) В общем проекте хоста я должен использовать чистый .NET Core (Microsoft.NET.Sdk и Microsoft.NETCore.App) вместо ASP.NET Core (Microsoft.NET.Sdk.Web и Microsoft.AspNetCore.App) с тех пор это не веб-проект?

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

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

спросил(а) 2018-09-21T02:40:00+03:00 1 год, 2 месяца назад
1
Решение
86

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

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

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

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

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

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

<ItemGroup>
<None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>

Логика веб-публикации

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

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

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

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

Если вы разрабатываете библиотеку классов, содержащую бритвенные представления, вам потребуется использовать Microsoft.NET.Sdk.Razor SDK для получения бритвенных инструментов (например, при использовании dotnet new razorclasslib шаблона 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, используя SDK "core" (при условии, что вы используете инструменты 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>

ответил(а) 2018-09-22T14:37:00+03:00 1 год, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема