Learn Rust Coding · Урок

Сборка настольного приложения

Подготовьте исполняемый файл.

Урок 4 из 413 шагов

«Сборка настольного приложения» — бесплатный урок 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.

Включение оптимизации на этапе компоновки, одного блока генерации кода, аварийного завершения при панике и удаления символов может уменьшить размер готового исполняемого файла на несколько мегабайт.

[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 завершён.

Можно начать бесплатно

Изучай Rust с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
144

Часто задаваемые вопросы

Урок «Сборка настольного приложения» бесплатный?

Да — полный текст урока «Сборка настольного приложения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы интерфейса немедленного режима
  2. Виджеты и компоновка
  3. Управление состоянием приложения
  4. Сборка настольного приложения
← Назад к Learn Rust Coding