นี่คือบทความคู่มือการใช้งาน dotnet publish ที่สรุปภาพรวม วิธีใช้งาน และ Best Practices สำหรับนำไปใช้จริงครับ คุณสามารถปรับแต่งเนื้อหาเพิ่มเติมให้เข้ากับโปรเจกต์ของคุณได้เลยครับ
เจาะลึก dotnet publish คำสั่งสำคัญสำหรับการ Deploy แอปพลิเคชัน .NET
เมื่อเราพัฒนาแอปพลิเคชันด้วย .NET ( เช่น ASP.NET Core, Worker Service หรือ Console App ) จนพร้อมใช้งานแล้ว ขั้นตอนสุดท้ายที่สำคัญที่สุดคือการเตรียมโค้ดและไฟล์ต่าง ๆ เพื่อนำไปรันบน Server หรือเครื่องปลายทาง คำสั่งที่จะมารับหน้าที่นี้คือ dotnet publish
บทความนี้จะพาไปทำความเข้าใจว่า dotnet publish ทำงานอย่างไร มีโหมดอะไรให้เลือกใช้ และคำสั่งยอดฮิตที่ต้องเจอในชีวิตจริงมีอะไรบ้าง
dotnet publish คืออะไร ?
คำสั่ง dotnet publish จะทำการ Compile ซอร์สโค้ด, อ่านไฟล์คอนฟิก ( เช่น appsettings.json ), รวบรวม Third-party Libraries ( NuGet Packages ) ที่จำเป็น และนำทั้งหมดมาจัดแพ็กเกจไว้ในโฟลเดอร์เดียวกัน ( โดยทั่วไปจะอยู่ที่ bin/Release/netxx.x/publish/ ) เพื่อให้พร้อมสำหรับนำไปวางและสั่งรันบน สภาพแวดล้อมจริง ( Production ) ได้ทันที
สิ่งที่แตกต่างจาก dotnet build คือ Build จะเน้นสำหรับการทดสอบรันในเครื่องพัฒนา แต่อาจไม่ได้รวบรวม Dependencies หรือทำ Optimization เท่ากับการ Publish
2 โหมดหลักในการ Publish ( Deployment Modes )
การ Publish ใน .NET สามารถเลือกสถาปัตยกรรมของไฟล์ Output ได้ 2 รูปแบบหลัก ๆ ตามความเหมาะสมของ Infrastructure
Framework-Dependent Deployment ( FDD )
เป็นค่าเริ่มต้น ( Default ) ของ .NET การใช้โหมดนี้ ไฟล์ที่ได้จะมีขนาดเล็กมาก เพราะมันจะไม่รวมตัวรันไทม์ ( .NET Runtime ) เข้าไปด้วย
- ข้อดี: ไฟล์มีขนาดเล็ก ( หลัก MB ), อัปเดตแพตช์ความปลอดภัยของ .NET core ได้ง่ายที่ตัว Server
- ข้อจำกัด: เครื่องปลายทาง ( Server/Docker ) จำเป็นต้องติดตั้ง .NET Runtime เวอร์ชันที่ตรงกันไว้ล่วงหน้า
- คำสั่งตัวอย่าง
dotnet publish -c Release
Self-Contained Deployment ( SCD )
โหมดนี้จะทำการมัดรวมแอปพลิเคชันของคุณเข้ากับ .NET Runtime ของระบบปฏิบัติการนั้น ๆ ไว้อยู่ในชุดเดียวกัน
- ข้อดี: เครื่องปลายทางไม่ต้องติดตั้ง .NET อะไรเลย สามารถ copy โฟลเดอร์ไปแล้วกดรันไฟล์ Executable ( .exe หรือ binary ) ได้ทันที หมดปัญหาเวอร์ชัน Runtime ไม่ตรงกัน
- ข้อจำกัด: ขนาดไฟล์จะใหญ่ขึ้นมาก ( อาจถึง 60MB-100MB+ ) และต้องระบุเป้าหมาย ( RID ) ให้ชัดเจนว่าจะเอาไปรันบน OS อะไร
- คำสั่งตัวอย่าง ( สำหรับ Linux x64 )
dotnet publish -c Release -r linux-x64 --self-contained true
เทคนิคการลดขนาดไฟล์และเพิ่มประสิทธิภาพ ( Optimization )
สำหรับสายรีดประสิทธิภาพ หรือต้องการทำ Docker Image ให้มีขนาดเล็กที่สุด .NET มีฟีเจอร์เด็ด ๆ ที่สามารถเปิดใช้งานผ่าน Arguments หรือใส่ในไฟล์ .csproj ได้
Single-File Executable ( -p:PublishSingleFile=true )
มัดรวมไฟล์ทุกอย่าง ( DLLs, Configs ) ให้เหลือเป็นไฟล์เดียวโดด ๆ สะดวกมากสำหรับ Console App หรือโปรแกรมที่ต้องส่งต่อให้คนอื่นdotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained true
Trimming / Tree-Shaking ( -p:PublishTrimmed=true )
ระบบจะทำการวิเคราะห์โค้ด และตัดโค้ดส่วนของ .NET Runtime หรือ Libraries ที่เราไม่ได้เรียกใช้งานทิ้งไป ช่วยลดขนาดของ Self-Contained App ลงได้อย่างมหาศาล ( เหมาะอย่างยิ่งสำหรับ Microservices บน Docker )dotnet publish -c Release -r linux-x64 -p:PublishTrimmed=true
( คำเตือน: ควรทดสอบแอปหลังเปิด Trimmed เสมอ เพราะอาจมีปัญหากับโค้ดที่ใช้ Reflection )
รวมคำสั่ง dotnet publish ที่ใช้บ่อยในชีวิตจริง
Publish สำหรับรันบน Docker ( Linux Container )
dotnet publish -c Release -r linux-x64 --self-contained false -o ./publish
( ใช้ -o เพื่อกำหนดโฟลเดอร์ปลายทางให้หาง่าย )
Publish เป็นไฟล์เดี่ยวสำหรับ Windows 64-bit ไม่ต้องง้อ .NET Runtime
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained true -o ./dist
เคลียร์โฟลเดอร์เก่าก่อนลุยชัวร์สุด ( --no-restore / clean )
แนะนำให้ทำการ dotnet clean ก่อน หรือใช้สคริปต์ลบโฟลเดอร์ปลายทางก่อนสั่ง publish เพื่อป้องกันไม่ให้มีไฟล์ขยะจากเวอร์ชันเก่าค้างอยู่ในการ Deploy
สรุป
dotnet publish คือสะพานเชื่อมระหว่าง “เครื่องนักพัฒนา” ไปสู่ “ระบบที่ใช้งานจริง” การเลือกปรับแต่งตัวเลือกอย่าง -r ( Runtime Identifier ), Self-Contained หรือการทำ Trimming จะช่วยให้เราได้แอปพลิเคชันที่มีขนาดและประสิทธิภาพเหมาะสมกับระบบ CI/CD pipeline และ Cloud Infrastructure ในยุคปัจจุบันมากที่สุดครับ
อ่านเพิ่มเติม