0Pricing
Learn Rust Coding · Lekcja

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_app

Zmniejszanie 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 = true

Ukrywanie 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 --release

Podpisywanie 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.app

Kompilacje 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 --release

Cel 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 host

Lista 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

  1. Podstawy UI w trybie immediate mode
  2. Widgety i układ
  3. Zarządzanie stanem aplikacji
  4. Pakowanie aplikacji desktopowej
← Powrót do Learn Rust Coding