0Pricing
Learn Rust Coding · บทเรียน

จัดแพ็กเกจแอปเดสก์ท็อป

เผยแพร่ไฟล์ไบนารีที่เรียกใช้ได้

จัดแพ็กเกจแอปเดสก์ท็อป เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน UI แบบโหมดทันที
  2. วิดเจ็ตและการจัดวาง
  3. จัดการสถานะแอป
  4. จัดแพ็กเกจแอปเดสก์ท็อป
← กลับไปที่ Learn Rust Coding