.NET Core 之 Metapackage 簡介
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 | <Project Sdk="Microsoft.NET.Sdk.Web"> |
預設只安裝了 4 個 package,若你用到了其他 package,需要自行加入。
.NET Core 2.0
MyMVC.csproj
1 | <Project Sdk="Microsoft.NET.Sdk.Web"> |
預設只安裝 Microsoft.AspNetCore.All
Metapackage。
但事實上 Microsoft.AspNetCore.All
已經包含了眾多 package。
Conclusion
- Metapackage 並不包含實作,只定義了包含哪些 package 與版本,讓我們設計專案時不用一個 package 一個 package 地加入
- Metapackage 也確保 package 間經過整合測試,減少 package 之間相容性問題