Eine Desktop-App paketieren
Liefern Sie ein ausführbares Binary aus.
Eine Desktop-App paketieren ist eine kostenlose Learn Rust Coding-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Learn Rust Coding-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Learn Rust Coding-Kurs umfasst insgesamt 4 Lektionen.
Vom Debug- zum Release-Build
Für die Entwicklung verwenden Sie cargo run, das ein nicht optimiertes Debug-Binary erstellt. Für die Verteilung benötigen Sie einen Release-Build: cargo build --release.
Release-Builds aktivieren Optimierungen und entfernen den Debug-Overhead. Dadurch entsteht ein deutlich kleineres und schnelleres Binary unter target/release/.
cargo build --release
# binary at target/release/my_appDas Binary verkleinern
egui-Anwendungen können groß sein, da sie ein GPU-Backend statisch einbinden. Verkleinern Sie sie mit einem Release-Profil in Cargo.toml.
Die Aktivierung von Link-Time-Optimierung, einer einzelnen Codegen-Einheit, panic-abort und dem Entfernen von Symbolen kann die Größe der fertigen ausführbaren Datei um mehrere Megabyte reduzieren.
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = trueKonsole unter Windows ausblenden
Unter Windows sollte eine GUI-Anwendung kein Konsolenfenster öffnen. Fügen Sie am Crate-Stamm das Attribut windows_subsystem hinzu und schränken Sie es auf Release-Builds ein, damit Sie beim Entwickeln weiterhin Protokolle sehen.
Andernfalls blitzt beim Doppelklicken auf die ausführbare Datei neben Ihrem Fenster ein schwarzes Terminal auf.
#![cfg_attr(
not(debug_assertions),
windows_subsystem = "windows"
)]
fn main() -> eframe::Result<()> { /* ... */ }Ein Fenstersymbol festlegen
Eine ausgereifte Anwendung verwendet ein eigenes Fenstersymbol. Laden Sie beim Start die PNG-Bytes, dekodieren Sie sie in RGBA und übergeben Sie ein IconData über NativeOptions.
Binden Sie das Bild mit include_bytes! ein, damit das Symbol direkt in der Binärdatei enthalten ist und nicht als separate Datei ausgeliefert werden muss.
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()
};Den Viewport konfigurieren
Der ViewportBuilder steuert das native Fenster: Anfangsgröße, Mindestgröße, Titel, Änderbarkeit der Größe und Fensterelemente.
Legen Sie sinnvolle Standardwerte fest, damit Ihre Anwendung beim ersten Start mit einer brauchbaren Größe und nicht mit einem winzigen oder übergroßen Fenster geöffnet wird.
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() };Assets einbetten
Für eine als einzelne Datei verteilbare Anwendung betten Sie Schriftarten, Bilder und Konfigurationsdaten mit include_bytes! und include_str! direkt in die Binärdatei ein.
So müssen Sie keinen Ressourcenordner ausliefern, und die Anwendung funktioniert auch dann, wenn sie aus einem anderen Arbeitsverzeichnis gestartet wird.
let font = egui::FontData::from_static(
include_bytes!("../assets/Inter.ttf")
);
// register font in ctx.set_fonts(...)App-Bundles unter macOS
Unter macOS ist eine einfache Binärdatei keine anklickbare App. Sie benötigen ein .app-Bundle mit einer Info.plist-Datei und einem .icns-Symbol.
Das Tool cargo-bundle automatisiert diesen Vorgang und liest die Metadaten aus einem Abschnitt [package.metadata.bundle] in Cargo.toml.
[package.metadata.bundle]
name = "My App"
identifier = "com.example.myapp"
icon = ["assets/icon.icns"]
# then: cargo bundle --releaseCodesignierung und Notarisierung
Wenn Sie eine Anwendung unter macOS auf anderen Rechnern verteilen möchten, müssen Sie sie mit einem Developer-ID-Zertifikat signieren und von Apple notarisieren lassen, sonst blockiert Gatekeeper die Anwendung.
Verwenden Sie codesign, um das Bundle zu signieren, reichen Sie es anschließend mit notarytool ein und heften Sie das Ticket an. Auch unter Windows empfiehlt sich eine Authenticode-Signatur, um SmartScreen-Warnungen zu vermeiden.
codesign --deep --force --options runtime \
--sign "Developer ID Application: Name (TEAMID)" \
MyApp.appPlattformübergreifende Builds
Für jedes Betriebssystem ist ein nativer Build erforderlich, da eframe plattformspezifische Bibliotheken für GPU und Fensterverwaltung verknüpft. Der zuverlässigste Ansatz besteht darin, auf jedem Zielbetriebssystem zu bauen, häufig über CI-Runner.
Tools wie cross sind für Linux-Ziele hilfreich, aber die echte Cross-Kompilierung von GUI-Binärdateien für macOS oder Windows unter Linux ist fehleranfällig – bevorzugen Sie daher Matrix-Builds in der CI.
# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --releaseDas Web-Ziel
egui lässt sich auch zu WebAssembly kompilieren. Bauen Sie mit dem Ziel wasm32-unknown-unknown und bündeln Sie die Anwendung mit trunk. Dadurch entsteht ein Paket aus HTML, JS und WASM, das Sie statisch hosten können.
Der gleiche App-Code läuft über eframe::WebRunner im Browser und wird in ein Canvas-Element eingebunden.
rustup target add wasm32-unknown-unknown
trunk build --release
# outputs dist/ ready to hostCheckliste für die Verteilung
Vor der Veröffentlichung: Optimieren Sie das Release-Profil auf geringe Größe, blenden Sie die Windows-Konsole aus, betten Sie ein Symbol und Assets ein, erstellen Sie ein Bundle für macOS und signieren Sie für macOS und Windows.
Testen Sie das fertige Artefakt auf einem sauberen Rechner – nicht auf Ihrem Entwicklungsrechner –, um fehlende Systembibliotheken oder Warnungen zu unsignierten Binärdateien zu erkennen, die bei echten Nutzern auftreten würden.
Kurzer Check
Warum fügen Sie das Attribut windows_subsystem hinzu?
Zusammenfassung
Erstellen Sie die Anwendung mit cargo build --release. Optimieren Sie anschließend das Release-Profil auf geringe Größe und blenden Sie die Windows-Konsole aus. Legen Sie ein Fenstersymbol und einen Viewport fest und betten Sie Assets mit include_bytes! ein, um eine eigenständige Binärdatei zu erhalten.
Erstellen Sie unter macOS ein Bundle mit cargo-bundle und signieren sowie notarisieren Sie es. Bauen Sie für eine plattformübergreifende Abdeckung pro Betriebssystem über die CI und zielen Sie mit trunk auf WebAssembly. Testen Sie das fertige Artefakt immer auf einem sauberen Rechner. Damit ist der egui-Kurs abgeschlossen.
Häufig gestellte Fragen
Ist die Lektion „Eine Desktop-App paketieren“ kostenlos?
Ja — der vollständige Text von „Eine Desktop-App paketieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Learn Rust Coding-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Learn Rust Coding-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Eine Desktop-App paketieren“?
Liefern Sie ein ausführbares Binary aus. Du übst Learn Rust Coding mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Learn Rust Coding zu starten?
Keine Vorkenntnisse erforderlich. Learn Rust Coding auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Eine Desktop-App paketieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Learn Rust Coding-Lektion Code schreiben und ausführen?
Ja. Jede Learn Rust Coding-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen der Immediate-Mode-UI
- Widgets und Layout
- App-Zustand verwalten
- Eine Desktop-App paketieren