MSIX คือฟอร์แมตแพ็กเกจสมัยใหม่ของ Windows ทำงานบนพื้นฐานของแซนด์บ็อกซ์ จึงแยกการเปลี่ยนแปลงระบบอย่างรีจิสทรีหรือการเชื่อมโยงไฟล์ออกจากระบบหลัก และเมื่อลบออกก็จะไม่เหลือไฟล์ตกค้างเลย นอกจากนี้ยังสามารถรวม x64, x86 และ ARM64 ไว้ในไฟล์เดียวด้วย MSIXBundle ได้ด้วย

ปัญหาคือการแจกจ่าย

หากต้องการติดตั้ง MSIX นอก Store ผู้ใช้ต้องเปิดโหมดนักพัฒนา เปิด PowerShell และเชื่อถือใบรับรอง สำหรับนักพัฒนานี่อาจเป็นขั้นตอนปกติ แต่สำหรับผู้ใช้ทั่วไป ทุกอย่างล้วนเป็นอุปสรรค อีกทั้งแม้จะสร้างแอปด้วย Electron หรือ Tauri ก็ยังมีหลายเฟรมเวิร์กที่ไม่รองรับการแพ็กเกจแบบ MSIX

เพราะแบบนี้จึงได้สร้าง MSIX Installer Generator ขึ้นมา เป็นเครื่องมือที่จัดการตั้งแต่การแพ็กเกจ MSIX ไปจนถึงการสร้างตัวติดตั้ง EXE แบบดับเบิลคลิกได้ในครั้งเดียว

เริ่มต้นมาได้อย่างไร

เดิมทีโปรเจกต์นี้ไม่ได้เกี่ยวข้องกับ MSIX เลย

ตอนแรกผมกำลังทำเฟรมเวิร์กตัวติดตั้งที่ใช้ฟอร์แมตแพ็กเกจของตัวเองชื่อ .atp เพื่อแจกจ่ายแอปที่สร้างด้วย WinUI 3 นอก Store โดยมีโครงสร้างคือบีบอัดด้วย 7z แล้วส่งให้ตัวติดตั้งจัดการเรื่องการลงทะเบียนรีจิสทรีหรือการสร้างชอร์ตคัตในเมนูเริ่ม ซึ่งกับการแพ็กเป็น EXE แบบง่าย ๆ ก็ทำงานได้ดีอยู่แล้ว

แล้ววันหนึ่งก็เกิดความคิดขึ้นมาว่า "ถ้าใช้ MSIX ที่รองรับแซนด์บ็อกซ์ด้วยมาทำตัวติดตั้งจะเป็นอย่างไร?" วิธี .atp เดิมนั้นสะดวกก็จริง แต่สุดท้ายก็ยังเป็นการติดตั้งแบบดั้งเดิมที่เขียนลงรีจิสทรีโดยตรงและสร้างโฟลเดอร์ใน AppData จึงไม่อาจรับประกันการลบแบบสะอาดได้ แต่ถ้าใช้ MSIX, Windows จะจัดการแยกในแซนด์บ็อกซ์ให้อัตโนมัติ และตอนลบก็ไม่เหลืออะไรตกค้างเลย

จึงเริ่มเพิ่มการรองรับการติดตั้ง MSIX แต่พอทำไปก็พบว่าผู้ใช้ต้องจัดการทุกอย่างเอง ทั้งการสร้างใบรับรอง การเขียน manifest และการแพ็กเกจ อีกทั้งยังมีหลายเฟรมเวิร์กที่ไม่รองรับการแพ็กเกจ MSIX สุดท้ายเลยพัฒนาเครื่องมือที่ทำให้ขั้นตอนแพ็กเกจเป็นอัตโนมัติ และตอนนี้มันกลายเป็นเครื่องมือที่จัดการได้ครบตั้งแต่การแพ็กเกจ MSIX ไปจนถึงการประกอบตัวติดตั้ง EXE ในครั้งเดียว

อยากแก้ปัญหาอะไร

ประสบการณ์ใช้งานในการแจกจ่ายด้วย MSIX นั้นไม่ดีเอาเสียเลย

  • "กรุณาเปิดโหมดนักพัฒนา" → ผู้ใช้เริ่มงง
  • "กรุณาเปิด PowerShell แบบผู้ดูแลระบบแล้วพิมพ์คำสั่ง" → งงยิ่งกว่าเดิม
  • "กรุณาเชื่อถือใบรับรอง" → งงที่สุด

ผมอยากได้ทั้งความสะดวกแบบตัวติดตั้ง EXE ดั้งเดิมที่แค่ดับเบิลคลิกก็จบ และข้อดีด้านแซนด์บ็อกซ์ของ MSIX ไปพร้อมกัน

MSIX Installer Generator ทำอะไรบ้าง

หลัก ๆ มีสองอย่าง

1. การแพ็กเกจ MSIX

รองรับการสร้างใบรับรอง การเขียน manifest และการแพ็กผลลัพธ์ของบิลด์ผ่าน GUI แม้เฟรมเวิร์กจะไม่รองรับการแพ็กเกจ MSIX ก็เพียงระบุโฟลเดอร์ผลลัพธ์ของบิลด์เท่านั้น หากเพิ่มโฟลเดอร์ตามสถาปัตยกรรมอย่าง x64, ARM64 ระบบจะอ่าน PE header เพื่อตรวจจับให้อัตโนมัติ และสร้างได้ทั้ง .msix เดี่ยวหรือ .msixbundle แบบหลายสถาปัตยกรรม

2. การประกอบตัวติดตั้ง EXE

แปลง MSIX ที่สร้างแล้วให้เป็นตัวติดตั้ง EXE แบบสแตนด์อโลนที่ติดตั้งได้ด้วยการดับเบิลคลิกเพียงครั้งเดียว ตัวติดตั้งจะจัดการทุกขั้นตอนที่จำเป็นสำหรับ sideloading ให้เองโดยอัตโนมัติ (เช่น การติดตั้งใบรับรอง การจัดการ dependency ฯลฯ) ในมุมของผู้ใช้ แค่ดาวน์โหลดตัวติดตั้งแล้วรันก็จบ ไม่ต้องใช้ PowerShell ไม่มีโหมดนักพัฒนา และไม่มีพรอมป์ตใบรับรองเด้งขึ้นมา

มีเครื่องมือ CLI ด้วย

ไม่ใช่แค่ GUI เท่านั้น ผมได้นำเครื่องมือ CLI (aticmsixgen) ขึ้น NuGet ไว้ด้วย เพื่อให้สามารถจัดการทั้งการแพ็กเกจ MSIX และการประกอบ EXE ผ่านบรรทัดคำสั่งใน CI หรือเวิร์กโฟลว์อัตโนมัติของ AI ได้ เป็นไฟล์รันเดี่ยวที่บิลด์ด้วย NativeAOT จึงไม่มีการพึ่งพา runtime

dotnet tool install --global aticmsixgen  

ตั้งแต่การสร้างใบรับรอง การเขียน manifest การแพ็กเกจ MSIX ไปจนถึงการประกอบ EXE ทำได้ทั้งหมดผ่าน CLI

เหมาะกับคนแบบไหน

  • คนที่อยากแจกจ่ายด้วย MSIX แต่รู้สึกว่ากระบวนการ sideloading เป็นภาระ
  • คนที่ใช้เฟรมเวิร์กอย่าง Electron, Tauri, WPF ฯลฯ ซึ่งไม่ได้รองรับการแพ็กเกจ MSIX มาแต่ต้น
  • คนที่อยากแจกจ่ายหลายสถาปัตยกรรมอย่าง x64, ARM64 ฯลฯ ผ่านตัวติดตั้งเดียว
  • คนที่อยากทำให้การแพ็กเกจ MSIX และการประกอบ EXE เป็นอัตโนมัติใน CI

ลิงก์

เป็นสัญญาอนุญาตแบบ MIT และหากมีฟีดแบ็กหรือปัญหา สามารถฝากไว้ที่ GitHub ได้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น