تجهيز تطبيق سطح المكتب
أصدر ملفًا ثنائيًا قابلًا للتشغيل
تجهيز تطبيق سطح المكتب درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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-abort، وإزالة الرموز إلى تقليص عدة ميغابايت من الملف التنفيذي النهائي.
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = trueإخفاء وحدة التحكم في Windows
ينبغي لتطبيق الواجهة الرسومية على Windows ألا يفتح نافذة وحدة تحكم. أضف السمة windows_subsystem في جذر الحزمة، واجعلها مشروطة بالإصدار حتى تستمر في رؤية السجلات أثناء التطوير.
من دون ذلك، يؤدي النقر المزدوج على الملف التنفيذي إلى إظهار طرفية سوداء للحظات بجانب نافذتك.
#![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()
};تهيئة منفذ العرض
يتحكم 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توقيع الشيفرة والتوثيق
يتطلب توزيع التطبيق على أجهزة أخرى تعمل بنظام macOS توقيعه بشهادة Developer ID وتوثيقه لدى Apple، وإلا فسيحظر Gatekeeper التطبيق.
استخدم codesign لتوقيع الحزمة، ثم أرسلها باستخدام notarytool وثبّت التذكرة. يستفيد Windows بالمثل من توقيع Authenticode لتجنّب تحذيرات SmartScreen.
codesign --deep --force --options runtime \
--sign "Developer ID Application: Name (TEAMID)" \
MyApp.appالبناء متعدد المنصات
يحتاج كل نظام تشغيل إلى بناء أصلي، لأن eframe تربط مكتبات GPU والنوافذ الخاصة بالمنصة. النهج الموثوق هو البناء على كل نظام مستهدف، وغالبًا عبر مشغلات CI.
تساعد أدوات مثل cross في استهداف Linux، لكن الترجمة المتقاطعة الحقيقية للملفات الثنائية الرسومية إلى 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. عيّن أيقونة للنافذة ومنفذ العرض، وضمّن الأصول باستخدام include_bytes! للحصول على ملف ثنائي مستقل بذاته.
أنشئ حزمة macOS باستخدام cargo-bundle ووقّع التطبيق ووثّقه؛ وابنِ لكل نظام تشغيل عبر CI لتغطية المنصات المتعددة، واستهدف WebAssembly باستخدام trunk. اختبر دائمًا المنتج النهائي على جهاز نظيف. بهذا يكتمل مساق egui.
الأسئلة الشائعة
هل درس «تجهيز تطبيق سطح المكتب» مجاني؟
نعم — نص درس «تجهيز تطبيق سطح المكتب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «تجهيز تطبيق سطح المكتب»؟
أصدر ملفًا ثنائيًا قابلًا للتشغيل تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تجهيز تطبيق سطح المكتب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات واجهة المستخدم Immediate-Mode
- الأدوات والتخطيط
- إدارة حالة التطبيق
- تجهيز تطبيق سطح المكتب