rust + tauri2 打包要求配置高,打包还慢?

AI摘要
【总结】内容为知识分享,分析Tauri2 release打包慢与内存占用高的原因,包括依赖树庞大、LTO与codegen-units=1重优化、多阶段串行打包及Windows MSVC额外开销,并给出提速方案:调整release配置、使用sccache缓存、精简bundle目标与插件依赖、优化硬件与链接器,同时说明速度与包体积的取舍及常见坑。

一句话总结:Tauri2 release打包慢、吃内存,根源是:庞大依赖树 + LLVM重优化(LTO) + 前端打包+资源嵌入+bundler多阶段串联 + Tauri2依赖比v1更重、插件体系更复杂;而且默认配置是优先体积、安全,不是编译速度。

一、为什么打包对机器配置要求高、内存占用大

  1. 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脚本本身就会拖慢、吃内存。

  2. 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打包就爆炸。

  1. 打包是串行多阶段任务,不是只编译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等外部工具,额外开销。
  1. Windows MSVC 额外痛点 MSVC链接器本身比lld更慢、内存开销更大;windows-rs批量生成巨大的bindings代码,很容易8G内存直接打满、OOM、编译卡死。
  2. 资源、图标、能力文件的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:缓存(收益最大,强烈推荐)

  1. 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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
躺平大叔 @ 躺平社区
文章
323
粉丝
21
喜欢
115
收藏
64
排名:236
访问:4.0 万
私信
所有博文
社区赞助商