Сборка настольного приложения
Подготовьте исполняемый файл.
«Сборка настольного приложения» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Основы интерфейса немедленного режима
- Виджеты и компоновка
- Управление состоянием приложения
- Сборка настольного приложения