5月28日 02:06

Tauri 应用打包流程有哪些关键步骤?

Tauri 是基于 Rust 的跨平台桌面应用框架,通过系统 WebView 渲染界面、Rust 处理后端逻辑,打包产物体积通常在 3-10 MB,远小于 Electron 的 80-150 MB。打包是 Tauri 开发的最后一步,也是最易出错的环节——配置错误、签名遗漏、平台差异都可能导致构建失败。以下逐步拆解打包流程的关键步骤。

环境准备与项目检查

打包前需确认两件事:工具链完整、项目配置正确。

工具链要求:

  • Rust stable 1.77+(Tauri 2.x 要求),通过 rustup update stable 升级
  • Node.js 20 LTS+,推荐 22 LTS
  • 平台工具:Windows 需要 Visual Studio 2022 Build Tools(C++ 桌面开发工作负载)+ WebView2 Runtime;macOS 需要 Xcode Command Line Tools;Linux 需要 libwebkit2gtk-4.1-dev 等系统库

项目检查清单:

  • src-tauri/tauri.conf.json 中的 identifier 不能是默认的 com.tauri.dev,必须改为反向域名格式如 com.example.myapp
  • 前端构建命令已配置且能正常运行(如 npm run build),输出目录需与 build.frontendDist 一致
  • Cargo.toml 中无未使用的依赖,避免增大产物体积
bash
# 验证 Rust 版本 rustc --version # 验证 Tauri CLI npx tauri info

tauri info 会列出当前环境的所有依赖状态,缺失项会标红提示——这是打包前最关键的一步。

核心构建命令与产物

bash
# 开发构建(快速验证,产物在 target/debug/) npx tauri build # 生产构建(启用优化,产物在 target/release/) npx tauri build --release

tauri build 执行两件事:先调用前端构建命令生成静态资源,再编译 Rust 代码生成原生二进制文件。最终产物位于 src-tauri/target/release/bundle/,按平台不同:

  • Windowsnsis/ 下生成 .exe 安装包,msi/ 下生成 .msi 安装包
  • macOSmacos/ 下生成 .app 应用包,dmg/ 下生成 .dmg 磁盘映像
  • Linuxdeb/ 下生成 .debappimage/ 下生成 .AppImagerpm/ 下生成 .rpm

通过 --bundles 参数可指定生成格式:

bash
# 只生成 NSIS 安装包 npx tauri build --bundles nsis # 只生成 DMG npx tauri build --bundles dmg # 跳过安装包,只生成可执行文件 npx tauri build --no-bundle

tauri.conf.json 打包配置要点

Tauri 2.x 的配置结构与 v1 有较大差异,核心打包相关字段如下:

json
{ "identifier": "com.example.myapp", "build": { "frontendDist": "../dist", "beforeBuildCommand": "npm run build" }, "bundle": { "active": true, "targets": "all", "icon": [ "icons/32x32.png", "icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" ], "windows": { "nsis": { "installMode": "currentUser" } }, "macOS": { "minimumSystemVersion": "10.15" }, "linux": { "deb": { "depends": ["libwebkit2gtk-4.1-0"] } } } }

常见配置失误:

  • identifier 仍为默认值:构建可成功但分发会被拒
  • frontendDist 路径不对:指向了不存在的目录,构建报错 "failed to read dir"
  • 缺少平台图标:macOS 要求 .icns,Windows 要求 .ico,缺失则用默认图标
  • targets 设为单平台但尝试跨平台构建:不会报错但只产出指定平台包

代码签名

未签名的应用在 Windows 上会触发 SmartScreen 警告,在 macOS 上会被 Gatekeeper 阻止。签名是分发的硬性要求。

Windows 签名:

tauri.conf.json 中配置:

json
{ "bundle": { "windows": { "signCommand": { "cmd": "signtool", "args": ["sign", "/fd", "SHA256", "/tr", "http://timestamp.digicert.com", "/td", "SHA256", "/f", "cert.pfx", "/p", "{{password}}"] } } } }

或通过环境变量在 CI 中传递证书:

bash
# GitHub Actions 中使用环境变量 TAURI_SIGNING_PRIVATE_KEY=path/to/key TAURI_SIGNING_PRIVATE_KEY_PASSWORD=***

macOS 签名:

需要 Apple Developer 证书,签名流程为:

bash
# 签名应用 codesign --force --deep --sign "Developer ID Application: Your Name (TEAMID)" target/release/bundle/macos/YourApp.app # 公证(notarization),提交到 Apple 服务器验证 xcrun notarytool submit target/release/bundle/macos/YourApp.dmg --apple-id "you@example.com" --team-id "TEAMID" --password "app-specific-password" --wait # 装订公证票据 xcrun stapler staple target/release/bundle/macos/YourApp.dmg

Tauri 2.x 支持在配置中自动签名:

json
{ "bundle": { "macOS": { "signingIdentity": "Developer ID Application: Your Name (TEAMID)" } } }

产物优化

默认 release 构建已启用基本优化,进一步压缩体积可在 Cargo.toml 中配置:

toml
[profile.release] panic = "abort" # 去除 unwind 相关代码,减小约 200 KB strip = true # 剥离调试符号 lto = true # 链接时优化,减小 20-30%,但编译时间增加 1.5-2 倍 codegen-units = 1 # 单编译单元,优化更彻底,编译更慢 opt-level = "s" # 优化体积而非速度
配置组合产物体积编译时间适用场景
默认 release~8 MB基准快速迭代
+ panic=abort + strip~6 MB+5%日常发布
+ LTO + codegen-units=1~4 MB+100%最终发布

macOS 还可用 --target universal-apple-darwin 生成同时支持 Intel 和 Apple Silicon 的通用二进制:

bash
npx tauri build --target universal-apple-darwin

CI/CD 自动化构建

手动在本机构建只能产出当前平台的安装包。正式项目应在 CI 中并行构建多平台产物。

yaml
# .github/workflows/release.yml name: Release on: push: tags: ['v*'] jobs: release: permissions: contents: write strategy: fail-fast: false matrix: include: - platform: macos-latest args: '--target aarch64-apple-darwin' - platform: macos-latest args: '--target x86_64-apple-darwin' - platform: windows-latest args: '' - platform: ubuntu-22.04 args: '' runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 - uses: dtolnay/rust-toolchain@stable - name: Install Linux dependencies if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf - run: npm install - uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_KEY }} with: tagName: ${{ github.ref_name }} releaseName: 'MyApp ${{ github.ref_name }}' releaseBody: 'See the assets below to download.' args: ${{ matrix.args }}

该配置在推送 tag 时触发,四个 job 并行构建 macOS (ARM)、macOS (x64)、Windows、Linux 产物,平均耗时 18-25 分钟。

常见构建失败排查

错误信息原因解决方案
failed to read dirfrontendDist 路径错误检查 tauri.conf.json 中 build.frontendDist 是否指向前端输出目录
identifier must be set使用了默认 identifier修改为反向域名格式
webkit2gtk not foundLinux 缺少系统依赖安装 libwebkit2gtk-4.1-dev 及相关包
WebView2 not foundWindows 缺少 WebView2安装 Microsoft Edge WebView2 Runtime
SmartScreen 蓝色警告Windows 应用未签名配置代码签名证书
macOS "已损坏" 提示应用未签名或未公证完成 codesign + notarization + stapler 流程
NSIS 下载超时网络问题手动下载 NSIS 放到缓存目录,或配置代理

调试技巧:

bash
# 查看详细构建日志 npx tauri build --verbose 2>&1 | tee build.log # 仅构建前端,跳过 Rust 编译(快速验证前端资源是否正确) npx tauri build --no-bundle # 检查当前环境配置 npx tauri info

Tauri 应用打包的核心流程可以概括为:确认环境、配置项目、执行构建、签名公证、优化产物、自动化分发。掌握每个环节的关键配置项和常见报错,就能在首次构建时一次通过,避免反复试错。

标签:Tauri