.NET Core 2.2 中的 Metapackage 和 SDK 有什么区别?

mls*_*lst 3 c# nuget asp.net-web-api .net-core asp.net-core

我试图在 .NET Core 术语中区分这两个概念。我将尝试用一个例子来说明我的困惑。

当我创建一个新的类库项目(例如:)时,dotnet new classlib -o myclasslib生成的.csproj文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在,如果我尝试在该项目中添加 WebApi 控制器类(例如,为了在创建的主 WebApi 应用程序中动态加载插件:),dotnet new webapi -o mywebapi我将需要使用ControllerBase类和[ApiController]属性等[HttpGet]内容。为了简单起见,我只是从 ControllerBase 派生 MyController,如下所示:

using System;

namespace myclasslib
{
    public class MyController : Microsoft.AspNetCore.Mvc.ControllerBase
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试构建这个dotnet build我收到错误:

错误 CS0234:命名空间“Microsoft”中不存在类型或命名空间名称“AspNetCore”(您是否缺少程序集引用?)

这是预料之中的,因为我创建了 classlib 项目,但是如果将 .csproj 中的 SDK 更改为Sdk="Microsoft.NET.Sdk.Web"并且也更改TargetFrameworknetcoreapp2.2(希望解析对ControllerBase类的引用),如下所示:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

我在构建项目时遇到同样的错误。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>
Run Code Online (Sandbox Code Playgroud)

我注意到 SDK 与我设置的相同,但还添加了一个元包:<PackageReference Include="Microsoft.AspNetCore.App" />

那么,如果我们已经指定要使用 Microsoft.NET.Sdk,为什么还需要显式添加元包呢?网络

还有一个问题:如果我们没有在 PackageReference 中指定元包版本(例如在生成的 webapi .csproj 中),则使用哪个版本的元包?

Chr*_*att 6

SDK 只是构建工具和 .NET Core 框架本身。ASP.NET Core 是一组 NuGet 包。本质上.NET Core 框架!= ASP.NET Core 代码。元包的概念只是无关紧要的。所谓的“ASP.NET Core”实际上是数十个单独的 NuGet 包。您可以单独引用每个内容,但正如您可以想象的那样,这既令人厌烦又容易出错。元包本质上是一个依赖于多个其他 NuGet 包的 NuGet 包。

因此,通过仅拉入元包,基本上该元包的所有依赖项也会被拉入。因此,您只需添加一个包引用即可Microsoft.AspNetCore.App开始竞争。然而,这样做的缺点是您可能会获得实际上并不需要的依赖项。对于 Web 应用程序之类的东西来说,这并不是什么大问题,因为可以修剪依赖关系,但类库不应该有过多的依赖关系。因此,您应该只从Microsoft.AspNetCore命名空间引用实际需要的各个 NuGet 包。