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

时间:2019-03-13 17:59:31

标签: c# asp.net-web-api asp.net-core .net-core nuget

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

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

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

到目前为止,一切都很好。现在,如果我尝试在此项目中添加WebApi控制器类(例如,以动态方式在创建为dotnet new webapi -o mywebapi的主WebApi应用程序中加载插件的目的),则需要使用类似ControllerBase类的东西以及[ApiController][HttpGet]属性。为了简单起见,我只需要像下面这样从ControllerBase派生MyController:

using System;

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

尝试使用dotnet build进行构建时出现错误:

  

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

这是预料之中的,因为我创建了classlib项目,但是如果将.csproj中的SDK更改为Sdk="Microsoft.NET.Sdk.Web",并且还将TargetFramework更改为netcoreapp2.2(希望将对{{3 }}类):

<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与我设置的SDK相同,但是还添加了一个metapackage:<PackageReference Include="Microsoft.AspNetCore.App" />

那么,如果我们已经指定要使用Microsoft.NET.Sdk,为什么我们需要显式添加metapackage。 Web

另一个问题:如果未在PackageReference中指定一个版本的metapackage(例如在此生成的webapi .csproj中)?

1 个答案:

答案 0 :(得分:1)

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