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

3

我试图在.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类和[ApiController]以及[HttpGet]属性之类的东西。为了保持简单,我只需从ControllerBase派生MyController,如下所示:

using System;

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

尝试使用“dotnet build”构建时,出现错误:
error CS0234:命名空间'Microsoft'中不存在'AspNetCore'的类型或命名空间名称(是否缺少程序集引用?)
这是可以预料的,因为我创建了一个类库项目,但如果将.csproj中的SDK更改为“Sdk = Microsoft.NET.Sdk.Web”,并将“TargetFramework”更改为“netcoreapp2.2”(希望解决对ControllerBase类的引用),就会发生变化。
<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个回答

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包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接