В чем разница между Metapackage и SDK в .NET Core 2.2? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь провести различие между этими двумя понятиями в терминологии .NET Core. Я попытаюсь проиллюстрировать свою путаницу на примере.

Когда я создаю новый проект библиотеки классов (например: dotnet new classlib -o myclasslib), сгенерированный файл .csproj выглядит следующим образом:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

Пока все хорошо. Теперь, если я попытаюсь добавить класс контроллера WebApi в этот проект (например, с целью динамической загрузки плагинов в моем основном приложении WebApi, созданном как: dotnet new webapi -o mywebapi), мне нужно будет использовать такие вещи, как ControllerBase class и [ApiController] и [HttpGet] атрибуты. Для простоты я просто извлекаю MyController из ControllerBase следующим образом:

using System;

namespace myclasslib
{
    public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
    {
    }
}

Попытка построить это с dotnet build Я получаю ошибку:

ошибка CS0234: тип или имя пространства имен AspNetCore не существует в пространстве имен «Microsoft» (отсутствует ссылка на сборку?)

Такого рода ожидалось, потому что я создал проект classlib, но если изменить SDK в .csproj на Sdk="Microsoft.NET.Sdk.Web", а также изменить TargetFramework на netcoreapp2.2 (в надежде разрешить ссылку на ControllerBase class) как это:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>
</Project>

Я получаю ту же ошибку при сборке проекта. Разве SDK не должен включать все, что мне нужно для создания проекта?

Если я создаю обычный проект webapi (например, dotnet new webapi -o mywebapi), сгенерированный .csproj выглядит так:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

Я заметил, что SDK совпадает с тем, который я установил, но есть также добавленный метапакет: <PackageReference Include="Microsoft.AspNetCore.App" />

Так зачем нам явно добавлять метапакет, если мы уже указали, что хотим использовать Microsoft.NET.Sdk. Web ?

Еще один вопрос: какая версия метапакета используется, если мы не указываем ее в PackageReference (как в этом сгенерированном webapi .csproj)?

1 Ответ

1 голос
/ 13 марта 2019

SDK - это всего лишь инструмент для сборки и сама платформа .NET Core.ASP.NET Core - это набор пакетов NuGet.По сути .NET Core Framework! = Код ASP.NET Core.Понятие метапакетов имеет только косвенную связь.То, что можно назвать «ядром ASP.NET», на самом деле представляет собой десятки отдельных пакетов NuGet.Вы могли бы ссылаться на каждого индивидуально, но, как вы можете себе представить, это было бы утомительно и подвержено ошибкам.Метапакеты - это, по сути, пакет NuGet, который зависит от множества других пакетов NuGet.

Таким образом, при извлечении только метапакета, по существу, все зависимости этого метапакета становятся и .Вы можете просто добавить ссылку на пакет для Microsoft.AspNetCore.App, и вы отправитесь в гонки.Однако недостатком этого является то, что вы потенциально получаете зависимости, которые вам на самом деле не нужны.Это не такая большая проблема с чем-то вроде веб-приложения, потому что зависимости могут быть обрезаны, но библиотека классов не должна иметь избыточных зависимостей.Таким образом, вы должны ссылаться только на отдельные пакеты NuGet, которые вам действительно нужны, из пространства имен Microsoft.AspNetCore.

...