打包桌面应用
发布可运行的二进制程序。
打包桌面应用 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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 中设置发布配置来减小体积。
启用链接时优化、单个代码生成单元、恐慌中止以及符号剥离,可以将最终可执行文件的大小减少数 MB。
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = true在 Windows 上隐藏控制台
在 Windows 上,GUI 应用不应生成控制台窗口。请在 crate 根部添加 windows_subsystem 属性,并将其限制为发布构建,这样开发时仍能看到日志。
否则,双击可执行文件时,窗口旁边会闪现一个黑色终端。
#![cfg_attr(
not(debug_assertions),
windows_subsystem = "windows"
)]
fn main() -> eframe::Result<()> { /* ... */ }设置窗口图标
经过完善的应用会设置自己的窗口图标。请在启动时加载 PNG 字节,将其解码为 RGBA,然后通过 NativeOptions 传入 IconData。
请使用 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 上,单独的二进制文件不是可点击的应用。您需要一个包含 Info.plist 和 .icns 图标的 .app 应用包。
cargo-bundle 工具可以自动完成这些工作:它会从 Cargo.toml 中的 [package.metadata.bundle] 部分读取元数据。
[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跨平台构建
每个 OS 都需要原生构建,因为 eframe 会链接平台的 GPU 和窗口库。可靠的做法是在每个目标 OS 上进行构建,通常通过 CI 运行器完成。
cross 等工具对 Linux 目标有所帮助,但从 Linux 真正交叉编译面向 macOS 或 Windows 的 GUI 二进制文件并不稳定,因此更推荐使用矩阵 CI 构建。
# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --releaseWeb 目标
egui 也可以编译为 WebAssembly。请使用 wasm32-unknown-unknown 目标进行构建,并使用 trunk 打包。它会生成一组 HTML/JS/WASM 文件,您可以将其托管为静态资源。
同一份 App 代码可以通过 eframe::WebRunner 在浏览器中运行,并挂载到画布元素上。
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 针对每个 OS 构建,以覆盖跨平台需求;使用 trunk 面向 WebAssembly 构建。始终在干净的设备上测试最终产物。至此,egui 课程就完成了。
常见问题解答
「打包桌面应用」课时是免费的吗?
是的 — 「打包桌面应用」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「打包桌面应用」这节课中我会学到什么?
发布可运行的二进制程序。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「打包桌面应用」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 即时模式 UI 基础
- 组件与布局
- 管理应用状态
- 打包桌面应用