Package 懶人包概念

Metapackage 為 .NET Core 2.0 所提出,目的在簡化對 package 的管理。

Version


macOS High Sierra 10.13.3
.NET Core SDK 2.1.101

NuGet


  • .NET Framework : 將所有 class 包在 一整包 .NET Framework 內
  • .NET Core : 將 class 拆分成 小包 的 NuGet package

.NET Core 從以前 一整包 framework 轉型成 package-based framework,也就是整個 framework 改由 package 所構成

簡單的說,以前 .NET Framework 是一個 framework 包含很多 DLL;而 .NET Core 是一個 DLL 就一個 package,你可以自行根據專案需求選用你用的 DLL

這也與目前主流 framework 思維相同,如 Angular、Laravel 都可以看到類似的設計

優點

  • Package 更新速度快:若 package 有 bug,可單獨發行更新版本,不用等 framework 統一發行 patch 版本
  • 選擇特定 OS 與 CPU 的 package : 若有特殊需求,需使對特定 OS 與 CPU 版本最佳化的 package
  • 可選擇只更新部分 package 版本:若 package 有 bug,可選擇只更新某 package,而不用被 framework patch 逼得要更新其他 package
  • 可選擇自己需要的 package : 若你只寫 ASP.NET,其實並不需要 Windows Form、Web Form、WPF 或 UWP 的 package,只需下載 ASP.NET 相關的 package 即可

缺點

  • 不同 Package 間可能有相容性問題:由於 package 各自發佈,沒經過與其他 package 的整合測試,有可能遇到 package 彼此相衝
  • Package 拆得太細,導致加入困難:.NET Core 由於 package 都最小化,隨便寫一個專案就可能要自己加入一堆 package

針對這兩個缺點,.NET Core 2.0 提出了 Metapackage 概念。

Metapackage


.NET Core 包含了以下幾個主要 Metapackage:

  • NETStandard.Library:包含 .NET Standard 所定義 API 的全部 package
  • Microsoft.NETCore.App:包含 .NET Core 所需要 API 的全部 package,也包含 .NET Standard,但沒有包含全部的 .NET Standard 的 package
  • Microsoft.AspNetCore.All:包含 ASP.NET 所需要 API 的全部 package,包括 Microsoft.NETCore.App,與其他與 ASP.NET 相關的 package。

專案只要加入了 Metapackage,就相當於加了 pakcage 懶人包,會自動幫你加入其他相關的 package。

除此之外,Microsoft 既然發行了 Metapckage,就會確保 Metapackage 所發行的版本中,各 package 的相容性已經過測試。

若你獨立更新 package 版本,可能會有 package 相容性問題,但若更新 Metapackage,則經過 Microsoft 測試,會挑選擇彼此相容的 package 版本

Microsoft.AspNetCore.All


實際體驗一下有 Metapackage 與沒有 Metapackage 的差異:

.NET Core 1.1

MyMVC.csproj

1
2
3
4
5
6
7
8
9
10
11
12
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
</ItemGroup>
</Project>

預設只安裝了 4 個 package,若你用到了其他 package,需要自行加入。

.NET Core 2.0

MyMVC.csproj

1
2
3
4
5
6
7
8
9
10
11
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.3" />
</ItemGroup>
</Project>

預設只安裝 Microsoft.AspNetCore.All Metapackage。

ech00

但事實上 Microsoft.AspNetCore.All 已經包含了眾多 package。

Conclusion


  • Metapackage 並不包含實作,只定義了包含哪些 package 與版本,讓我們設計專案時不用一個 package 一個 package 地加入
  • Metapackage 也確保 package 間經過整合測試,減少 package 之間相容性問題

Reference


Microsoft Docs, Packages, metapackages and frameworks

2018-03-21