Pakowanie aplikacji desktopowej
Przygotuje Pan/Pani gotowy do uruchomienia plik binarny.
Pakowanie aplikacji desktopowej to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Od wersji debug do release
Podczas tworzenia używa się cargo run, które buduje niezoptymalizowany plik binarny debug. Do dystrybucji potrzebna jest kompilacja release: cargo build --release.
Kompilacje release włączają optymalizacje i usuwają narzut debugowania, tworząc znacznie mniejszy i szybszy plik binarny w katalogu target/release/.
cargo build --release
# binary at target/release/my_appZmniejszanie pliku binarnego
Aplikacje egui mogą być duże, ponieważ statycznie dołączają backend GPU. Rozmiar można zmniejszyć za pomocą profilu release w pliku Cargo.toml.
Włączenie optymalizacji czasu linkowania, pojedynczej jednostki generowania kodu, przerywania działania przy panice oraz usuwania symboli może zmniejszyć końcowy plik wykonywalny o wiele megabajtów.
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = trueUkrywanie konsoli w systemie Windows
W systemie Windows aplikacja GUI nie powinna otwierać okna konsoli. Dodaj atrybut windows_subsystem w katalogu głównym skrzynki i ogranicz go do kompilacji wydaniowej, aby podczas tworzenia nadal wyświetlać logi.
Bez tego dwukrotne kliknięcie pliku wykonywalnego powoduje mignięcie czarnego terminala obok okna aplikacji.
#![cfg_attr(
not(debug_assertions),
windows_subsystem = "windows"
)]
fn main() -> eframe::Result<()> { /* ... */ }Ustawianie ikony okna
Dopracowana aplikacja ustawia własną ikonę okna. Wczytaj bajty PNG podczas uruchamiania, zdekoduj je do formatu RGBA i przekaż IconData przez NativeOptions.
Osadź obraz za pomocą include_bytes!, aby ikona znalazła się wewnątrz pliku binarnego, a nie była osobnym plikiem.
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()
};Konfigurowanie obszaru widoku
ViewportBuilder steruje natywnym oknem: jego początkowym i minimalnym rozmiarem, tytułem, możliwością zmiany rozmiaru oraz dekoracjami.
Ustaw rozsądne wartości domyślne, aby przy pierwszym uruchomieniu aplikacja otwierała się w użytecznym rozmiarze, a nie w zbyt małym lub zbyt dużym oknie.
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() };Osadzanie zasobów
W przypadku dystrybucji w pojedynczym pliku osadź czcionki, obrazy i konfigurację bezpośrednio w pliku binarnym za pomocą include_bytes! i include_str!.
Eliminuje to konieczność dostarczania folderu zasobów i zapobiega awariom aplikacji uruchamianej z innego katalogu roboczego.
let font = egui::FontData::from_static(
include_bytes!("../assets/Inter.ttf")
);
// register font in ctx.set_fonts(...)Pakiety aplikacji macOS
W systemie macOS samodzielny plik binarny nie jest aplikacją, którą można uruchomić kliknięciem. Potrzebny jest pakiet .app zawierający Info.plist oraz ikonę .icns.
Narzędzie cargo-bundle automatyzuje ten proces, odczytując metadane z sekcji [package.metadata.bundle] w pliku Cargo.toml.
[package.metadata.bundle]
name = "My App"
identifier = "com.example.myapp"
icon = ["assets/icon.icns"]
# then: cargo bundle --releasePodpisywanie kodu i notaryzacja
Dystrybucja aplikacji na innych komputerach z systemem macOS wymaga podpisania jej certyfikatem Developer ID oraz przeprowadzenia notaryzacji przez Apple — w przeciwnym razie Gatekeeper zablokuje aplikację.
Użyj codesign, aby podpisać pakiet, następnie prześlij go za pomocą notarytool i dołącz bilet notaryzacji. W systemie Windows również warto użyć podpisu Authenticode, aby uniknąć ostrzeżeń SmartScreen.
codesign --deep --force --options runtime \
--sign "Developer ID Application: Name (TEAMID)" \
MyApp.appKompilacje wieloplatformowe
Każdy system operacyjny wymaga natywnej kompilacji, ponieważ eframe łączy biblioteki GPU i obsługi okien właściwe dla danej platformy. Najpewniejszym rozwiązaniem jest kompilowanie na każdym docelowym systemie, często za pomocą runnerów CI.
Narzędzia takie jak cross ułatwiają pracę z celami dla systemu Linux, ale prawdziwa kompilacja skrośna aplikacji GUI dla macOS lub Windows z systemu Linux bywa zawodna — lepiej użyć kompilacji macierzowej w CI.
# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --releaseCel webowy
egui można również kompilować do WebAssembly. Użyj celu wasm32-unknown-unknown i pakuj aplikację za pomocą trunk, które tworzy zestaw HTML/JS/WASM możliwy do hostowania jako statyczne pliki.
Ten sam kod App działa w przeglądarce za pośrednictwem eframe::WebRunner, osadzony w elemencie canvas.
rustup target add wasm32-unknown-unknown
trunk build --release
# outputs dist/ ready to hostLista kontrolna dystrybucji
Przed wydaniem aplikacji: dostosuj profil wydaniowy pod kątem rozmiaru, ukryj konsolę systemu Windows, osadź ikonę i zasoby, utwórz pakiet dla systemu macOS oraz podpisz aplikację dla systemów macOS i Windows.
Przetestuj końcowy artefakt na czystym komputerze — nie na komputerze używanym do tworzenia — aby wykryć brakujące biblioteki systemowe lub ostrzeżenia dotyczące niepodpisanego pliku binarnego, które zobaczyliby użytkownicy.
Szybkie sprawdzenie
Dlaczego należy dodać atrybut windows_subsystem?
Podsumowanie
Utwórz wersję wydaniową za pomocą cargo build --release, a następnie zoptymalizuj profil wydaniowy pod kątem rozmiaru i ukryj konsolę systemu Windows. Ustaw ikonę oraz obszar widoku okna i osadź zasoby za pomocą include_bytes!, aby uzyskać samowystarczalny plik binarny.
W systemie macOS utwórz pakiet za pomocą cargo-bundle, a następnie podpisz go i przeprowadź notaryzację. Kompiluj osobno dla każdego systemu za pośrednictwem CI, aby zapewnić obsługę wielu platform, a dla WebAssembly użyj trunk. Zawsze testuj końcowy artefakt na czystym komputerze. Na tym kończy się kurs egui.
Często zadawane pytania
Czy lekcja „Pakowanie aplikacji desktopowej” jest bezpłatna?
Tak — pełny tekst „Pakowanie aplikacji desktopowej” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.
Co nauczysz się w „Pakowanie aplikacji desktopowej”?
Przygotuje Pan/Pani gotowy do uruchomienia plik binarny. Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?
Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Pakowanie aplikacji desktopowej”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?
Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy UI w trybie immediate mode
- Widgety i układ
- Zarządzanie stanem aplikacji
- Pakowanie aplikacji desktopowej