rust + tauri2 打包要求配置高,打包还慢?
一句话总结:Tauri2 release打包慢、吃内存,根源是:庞大依赖树 + LLVM重优化(LTO) + 前端打包+资源嵌入+bundler多阶段串联 + Tauri2依赖比v1更重、插件体系更复杂;而且默认配置是优先体积、安全,不是编译速度。
一、为什么打包对机器配置要求高、内存占用大
tauri + wry 依赖链非常厚 Tauri2 基于全新的IPC、Capability权限模型、重构的wry webview层,加上大量平台绑定(windows、gtk、webkit、accessibility、clipboard、tray、dialog、updater、各种plugin),冷构建要编译几百个crates,windows平台的windows-rs系列crates尤其吃内存、编译久。
区别于Tauri1:v2为了移动端、更强安全模型,依赖更多、build脚本更多。很多crates自带build.rs(链接原生库、生成绑定),build脚本本身就会拖慢、吃内存。
release默认推荐开启 LTO + codegen-units=1 为了二进制更小、去掉死代码,官方文档推荐:
[profile.release]
lto = true
codegen-units = 1
lto=true 是链接时全程序优化,LLVM会把所有crates的IR拉到一起做优化,非常吃内存、CPU、耗时;codegen-units=1 关闭并行codegen,进一步拉长编译时间(好处是优化更好、包更小)。
这是最核心的“慢”来源:dev模式没有LTO,所以你
tauri dev很快,tauri build打包就爆炸。
- 打包是串行多阶段任务,不是只编译Rust
tauri build完整流程:
- 执行前端打包(vite/rollup/webpack,生成dist)
- 运行tauri-build build.rs:扫描资源、icons、capabilities配置、生成绑定、嵌入前端资源
- cargo –release 编译rust(LTO+LLVM优化)
- tauri-bundler:打包成msi/nsis/dmg/deb/appimage,签名、压缩、生成安装包 每一步串行,只要一步慢,整体就慢;而且bundler还要调用WiX/NSIS/linuxdeploy等外部工具,额外开销。
- Windows MSVC 额外痛点 MSVC链接器本身比lld更慢、内存开销更大;windows-rs批量生成巨大的bindings代码,很容易8G内存直接打满、OOM、编译卡死。
- 资源、图标、能力文件的build.rs重扫描 Tauri2对capabilities、resources目录监听更严格,只要目录文件变动,build.rs就会重新跑,容易不必要的触发重编译。
二、分两类优化方案(开发打包提速,和正式发布)
注意取舍:速度和包体积是互斥的。
✅ 方案A:本地调试打包(只求快,不追求极致小包)
修改 src-tauri/Cargo.toml
[profile.release]
# 提速优先,牺牲一点优化
lto = false
codegen-units = 8
opt-level = 2
panic = "abort"
strip = true
codegen-units = N:N越大,codegen并行度越高、编译越快,但是LTO效果变差、包变大opt-level=2:release默认,比s/z快很多lto=false:最大提速,代价是二进制会明显变大
如果你只是本地验证打包逻辑,甚至可以用 tauri build --debug,走dev profile,没有LTO,速度快很多,只是产物不能发给用户。
✅ 方案B:缓存(收益最大,强烈推荐)
- sccache:全局缓存rustc/LLVM编译产物,跨项目、跨多次build复用,是Tauri开发标配
cargo install sccache
在 ~/.cargo/config.toml:
[build]
rustc-wrapper = "sccache"
第一次还是冷编译,第二次起大部分依赖直接命中缓存,速度提升巨大。 2. 不要删 src-tauri/target,这是cargo增量编译缓存; 3. 前端单独打包,不要每次tauri build都重新跑前端build:在tauri.conf.json里beforeBuildCommand改成只在需要时执行,或者直接指定已经build好的dist目录。
✅ 方案C:精简打包目标、关闭不需要的bundle
tauri.conf.json
"bundle": {
"targets": ["nsis"]
}
不要用"all",一次只生成你当前需要的安装包格式,不要同时生成msi、nsis、zip等一堆,bundler会多次处理、签名、压缩,非常耗时间。
✅ 方案D:精简依赖(治本)
- 检查tauri-plugin,没用的插件全部删掉,v2插件独立,每多一个plugin就多一整棵依赖树;
- 避免同时引入多个版本的windows-rs、openssl等重量级crate;
- 关闭不需要的feature:很多crate默认带很多feature,在Cargo.toml手动精简features。
✅ 方案E:硬件与系统层面
- 内存:Windows打包建议至少16G,32G更舒服;8G很容易OOM、swap狂读,速度暴跌;
- 硬盘:target目录放NVMe固态,机械硬盘编译会慢几倍;
- 链接器:Windows可以切换到lld(比MSVC link快很多)。
三、给你一个简单的取舍建议
- 日常开发验证打包:
lto=false+codegen-units=8+ sccache,快很多; - 正式发版:切回
lto=true, codegen-units=1拿更小包; - CI流水线:一定要开sccache + 缓存target + node_modules,否则每次全量编译非常折磨。
四、常见坑
- 不要每次打包都清target、删node_modules,缓存直接废掉;
- Windows上如果开了杀毒软件实时扫描target目录,会严重拖慢编译;
- 前端dist很大、资源很多,也会拉长build.rs和bundler阶段。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu