Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Metapackage ใน C# ASP.NET Core คืออะไร

Metapackage (เมตาแพ็กเกจ) ใน ASP.NET Core

Metapackage คือแพ็กเกจ NuGet ที่ ไม่มีโค้ดหรือ DLL ใดๆ เอง แต่ประกอบไปด้วย Dependencies (การพึ่งพา) ไปยังแพ็กเกจอื่นๆ หลายตัว เมื่อติดตั้ง Metapackage จะดึงแพ็กเกจที่เกี่ยวข้องทั้งหมดมาติดตั้งไปพร้อมกัน

Microsoft.AspNetCore.App - Metapackage หลัก

ตั้งแต่ ASP.NET Core 2.1 เป็นต้นมา ใช้ Microsoft.AspNetCore.App เป็น Metapackage หลัก (แทน Microsoft.AspNetCore.All ที่เก่า)

แพ็กเกจที่รวมอยู่ใน Microsoft.AspNetCore.App

หมวดหมู่แพ็กเกจหลัก
Hosting & ServerMicrosoft.AspNetCore.Server.Kestrel, Microsoft.AspNetCore.Server.IISIntegration
Routing & MiddlewareMicrosoft.AspNetCore.Routing, Microsoft.AspNetCore.Diagnostics
MVC & RazorMicrosoft.AspNetCore.Mvc, Microsoft.AspNetCore.Mvc.Razor
Authentication & SecurityMicrosoft.AspNetCore.Authentication.*, Microsoft.AspNetCore.DataProtection
ConfigurationMicrosoft.Extensions.Configuration.*, Microsoft.Extensions.Options.*
LoggingMicrosoft.Extensions.Logging.*, Microsoft.Extensions.Logging.Console
Dependency InjectionMicrosoft.Extensions.DependencyInjection
Base Class LibrarySystem.Runtime, System.Collections, System.Linq, System.Text.Json, etc.

วิธีใช้งานใน .csproj

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <!-- ไม่ต้องระบุ PackageReference Microsoft.AspNetCore.App -->
    <!-- SDK Web จะ include อัตโนมัติ -->
  </PropertyGroup>
</Project>

สำหรับ SDK แบบอื่น (Worker, Console) ต้องระบุเอง:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
  </ItemGroup>
</Project>

FrameworkReference vs PackageReference

ประเภทคำอธิบาย
FrameworkReferenceอ้างอิง Shared Framework ที่ติดตั้งบนเครื่อง (เร็วกว่า ไม่ copy DLL ไป output)
PackageReferenceดาวน์โหลดจาก NuGet copy DLL ไป output folder (เก่า)

ตั้งแต่ ASP.NET Core 3.0+ ใช้ FrameworkReference แทน PackageReference สำหรับ Microsoft.AspNetCore.App

ประโยชน์ของ Metapackage

  • ง่ายต่อการเริ่มโปรเจกต์ - ติดตั้งแพ็กเกจเดียวได้ทุกอย่างที่จำเป็น
  • Version Compatibility - ทุกแพ็กเกจใน Metapackage ถูกทดสอบร่วมกัน เวอร์ชันเข้ากันได้
  • ลดความซับซ้อน .csproj - ไม่ต้องจัดการ PackageReference หลายสิบตัว
  • Shared Framework - ใช้ Shared Framework บนเครื่อง/Container ลดขนาด Deployment

ข้อจำกัดและข้อควรระวัง

⚠️ ข้อจำกัดสำคัญ:
  • Metapackage ให้ พื้นฐาน (Baseline) เท่านั้น - ไม่ครอบคลุมทุกสถานการณ์
  • ยังต้องติดตั้งแพ็กเกจเพิ่มสำหรับ: Entity Framework Core, SignalR, gRPC, API Versioning, Swagger, HealthChecks, etc.
  • ขนาด Metapackage ใหญ่ (รวมหลายสิบแพ็กเกจ) - อาจดึง dependency ที่ไม่ใช้มา

ตัวอย่าง: เพิ่มแพ็กเกจนอก Metapackage

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <!-- EF Core - ไม่อยู่ใน Metapackage -->
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.*" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.*" />
    
    <!-- Swagger/OpenAPI -->
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.*" />
    
    <!-- Health Checks -->
    <PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.*" />
  </ItemGroup>
</Project>

ประวัติความเป็นมา

เวอร์ชันMetapackageหมายเหตุ
ASP.NET Core 1.xMicrosoft.AspNetCore.* (หลายแพ็กเกจแยก)จัดการยาก ต้องระบุ version เอง
ASP.NET Core 2.0Microsoft.AspNetCore.Allรวมทุกอย่าง (ใหญ่เกินไป)
ASP.NET Core 2.1+Microsoft.AspNetCore.AppLeaner, Shared Framework, รองรับ LTS
ASP.NET Core 3.0+Microsoft.AspNetCore.App (FrameworkReference)ไม่ใช่ PackageReference แล้ว

สรุป

  • Metapackage = แพ็กเกจที่รวม Dependencies ไว้ด้วยกัน
  • Microsoft.AspNetCore.App = Metapackage หลักของ ASP.NET Core
  • ใช้ผ่าน <FrameworkReference Include="Microsoft.AspNetCore.App" />
  • ให้พื้นฐานครบสำหรับ Web App แต่อาจต้องเพิ่มแพ็กเกจเฉพาะด้าน
  • ช่วยลดปัญหา Version Conflict และลดขนาด Deployment ด้วย Shared Framework