จัดแพ็กเกจแอปเดสก์ท็อป
เผยแพร่ไฟล์ไบนารีที่เรียกใช้ได้
จัดแพ็กเกจแอปเดสก์ท็อป เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
จากการดีบักสู่รุ่นเผยแพร่
การพัฒนาใช้ cargo run ซึ่งสร้างไบนารีสำหรับดีบักที่ยังไม่ได้ปรับประสิทธิภาพ สำหรับการเผยแพร่ คุณต้องการบิลด์รุ่นเผยแพร่: cargo build --release
บิลด์รุ่นเผยแพร่จะเปิดใช้การปรับประสิทธิภาพและตัดค่าใช้จ่ายของการดีบักออก ทำให้ได้ไบนารีที่มีขนาดเล็กลงและทำงานเร็วขึ้นมากภายใต้ target/release/
cargo build --release
# binary at target/release/my_appการลดขนาดไบนารี
แอป egui อาจมีขนาดใหญ่เนื่องจากเชื่อมโยงแบ็กเอนด์ GPU แบบสแตติก ปรับลดขนาดด้วยโปรไฟล์รุ่นเผยแพร่ใน Cargo.toml
การเปิดใช้การปรับประสิทธิภาพขณะเชื่อมโยง หน่วยสร้างโค้ดเพียงหน่วยเดียว การยุติเมื่อเกิด panic และการตัดสัญลักษณ์ สามารถลดขนาดไฟล์ปฏิบัติการสุดท้ายได้หลายเมกะไบต์
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = trueการซ่อนคอนโซลบน Windows
บน Windows แอป GUI ไม่ควรเปิดหน้าต่างคอนโซลขึ้นมา ให้เพิ่มแอตทริบิวต์ windows_subsystem ที่ระดับรากของ crate โดยกำหนดให้มีผลเฉพาะรุ่นเผยแพร่ เพื่อให้ยังเห็นบันทึกระหว่างพัฒนา
หากไม่ทำเช่นนี้ การดับเบิลคลิกไฟล์ปฏิบัติการจะแสดงเทอร์มินัลสีดำขึ้นมาชั่วครู่ข้างหน้าต่างของคุณ
#![cfg_attr(
not(debug_assertions),
windows_subsystem = "windows"
)]
fn main() -> eframe::Result<()> { /* ... */ }การตั้งไอคอนหน้าต่าง
แอปที่ดูสมบูรณ์ควรมีไอคอนหน้าต่างเป็นของตัวเอง โหลดไบต์ PNG ตอนเริ่มต้น ถอดรหัสเป็น RGBA แล้วส่ง IconData ผ่าน NativeOptions
ฝังรูปภาพด้วย include_bytes! เพื่อให้ไอคอนรวมอยู่ภายในไบนารี แทนที่จะเป็นไฟล์แยกต่างหาก
let icon = eframe::icon_data::from_png_bytes(
include_bytes!("../assets/icon.png")
).unwrap();
let opts = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default().with_icon(icon),
..Default::default()
};การกำหนดค่า Viewport
ViewportBuilder ควบคุมหน้าต่างเนทีฟ ได้แก่ ขนาดเริ่มต้น ขนาดขั้นต่ำ ชื่อเรื่อง ความสามารถในการปรับขนาด และการตกแต่งหน้าต่าง
กำหนดค่าเริ่มต้นที่เหมาะสม เพื่อให้แอปเปิดด้วยขนาดที่ใช้งานได้ตั้งแต่ครั้งแรก แทนที่จะเป็นหน้าต่างที่เล็กหรือใหญ่เกินไป
let viewport = egui::ViewportBuilder::default()
.with_inner_size([900.0, 600.0])
.with_min_inner_size([400.0, 300.0])
.with_title("My App");
let opts = eframe::NativeOptions { viewport, ..Default::default() };การฝังทรัพยากร
หากต้องการไฟล์แจกจ่ายเพียงไฟล์เดียว ให้ฝังแบบอักษร รูปภาพ และการตั้งค่าไว้ในไบนารีโดยตรงด้วย include_bytes! และ include_str!
วิธีนี้ไม่ต้องแจกจ่ายโฟลเดอร์ทรัพยากร และป้องกันไม่ให้แอปทำงานผิดพลาดเมื่อเรียกใช้จากไดเรกทอรีทำงานอื่น
let font = egui::FontData::from_static(
include_bytes!("../assets/Inter.ttf")
);
// register font in ctx.set_fonts(...)ชุดแอปบน macOS
บน macOS ไบนารีเปล่า ๆ ไม่ใช่แอปที่คลิกเปิดได้ คุณต้องมีชุด .app ที่มี Info.plist และไอคอน .icns
เครื่องมือ cargo-bundle ทำขั้นตอนนี้โดยอัตโนมัติ โดยอ่านข้อมูลกำกับจากส่วน [package.metadata.bundle] ใน Cargo.toml
[package.metadata.bundle]
name = "My App"
identifier = "com.example.myapp"
icon = ["assets/icon.icns"]
# then: cargo bundle --releaseการลงนามโค้ดและการรับรองโดย Apple
การแจกจ่ายบน macOS ไปยังเครื่องอื่นจำเป็นต้องลงนามด้วยใบรับรอง Developer ID และส่งให้ Apple รับรอง มิฉะนั้น Gatekeeper จะบล็อกแอป
ใช้ codesign เพื่อลงนามชุดแอป จากนั้นส่งด้วย notarytool และแนบตั๋วรับรองไว้กับชุดแอป ส่วน Windows ก็ได้ประโยชน์จากลายเซ็น Authenticode เช่นกัน เพราะช่วยหลีกเลี่ยงคำเตือนจาก SmartScreen
codesign --deep --force --options runtime \
--sign "Developer ID Application: Name (TEAMID)" \
MyApp.appการสร้างสำหรับหลายแพลตฟอร์ม
แต่ละ OS ต้องใช้การสร้างแบบเนทีฟ เนื่องจาก eframe เชื่อมโยงกับไลบรารี GPU และหน้าต่างของแพลตฟอร์มนั้น วิธีที่เชื่อถือได้คือสร้างบน OS เป้าหมายแต่ละระบบ ซึ่งมักทำผ่านตัวรันงาน CI
เครื่องมืออย่าง cross ช่วยสำหรับเป้าหมาย Linux ได้ แต่การคอมไพล์ข้ามแพลตฟอร์มไบนารี GUI ไปยัง macOS หรือ Windows จาก Linux ยังไม่เสถียรนัก — ควรใช้การสร้างแบบเมทริกซ์ผ่าน CI
# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --releaseเป้าหมายเว็บ
egui ยังสามารถคอมไพล์เป็น WebAssembly ได้ด้วย ให้สร้างโดยใช้เป้าหมาย wasm32-unknown-unknown และรวมไฟล์ด้วย trunk ซึ่งจะสร้างชุด HTML/JS/WASM ที่คุณนำไปโฮสต์แบบสแตติกได้
โค้ด App เดิมทำงานในเบราว์เซอร์ผ่าน eframe::WebRunner โดยติดตั้งลงบนองค์ประกอบ canvas
rustup target add wasm32-unknown-unknown
trunk build --release
# outputs dist/ ready to hostรายการตรวจสอบก่อนแจกจ่าย
ก่อนแจกจ่าย ให้ปรับโปรไฟล์รุ่นเผยแพร่ให้มีขนาดเล็ก ซ่อนคอนโซล Windows ฝังไอคอนและทรัพยากร สร้างชุดแอปสำหรับ macOS และลงนามทั้งสำหรับ macOS และ Windows
ทดสอบไฟล์ผลลัพธ์สุดท้ายบนเครื่องที่สะอาด ไม่ใช่เครื่องพัฒนา เพื่อค้นหาไลบรารีระบบที่ขาดหายหรือคำเตือนเกี่ยวกับไบนารีที่ไม่ได้ลงนาม ซึ่งผู้ใช้จริงอาจพบ
ตรวจสอบความเข้าใจ
เหตุใดจึงต้องเพิ่มแอตทริบิวต์ windows_subsystem
สรุป
สร้างโปรแกรมด้วย cargo build --release จากนั้นปรับโปรไฟล์รุ่นเผยแพร่ให้มีขนาดเล็กและซ่อนคอนโซล Windows ตั้งค่าไอคอนและ Viewport ของหน้าต่าง แล้วฝังทรัพยากรด้วย include_bytes! เพื่อให้ได้ไบนารีที่พร้อมใช้งานในตัวเอง
บน macOS ให้สร้างชุดแอปด้วย cargo-bundle แล้วลงนามและส่งให้รับรอง สร้างแยกตาม OS ผ่าน CI เพื่อรองรับหลายแพลตฟอร์ม และกำหนดเป้าหมายเป็น WebAssembly ด้วย trunk ทดสอบไฟล์ผลลัพธ์สุดท้ายบนเครื่องที่สะอาดเสมอ เท่านี้ก็จบหลักสูตร egui แล้ว
คำถามที่พบบ่อย
บทเรียน “จัดแพ็กเกจแอปเดสก์ท็อป” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “จัดแพ็กเกจแอปเดสก์ท็อป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “จัดแพ็กเกจแอปเดสก์ท็อป”
เผยแพร่ไฟล์ไบนารีที่เรียกใช้ได้ คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “จัดแพ็กเกจแอปเดสก์ท็อป” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน UI แบบโหมดทันที
- วิดเจ็ตและการจัดวาง
- จัดการสถานะแอป
- จัดแพ็กเกจแอปเดสก์ท็อป