首页 / Tauri 2 入门教程 / 构建与打包初体验

Tauri 2 入门教程

构建与打包初体验

本教程共 48 篇 · 第 13 篇 · 更新于 2026-08-09 · 约 7 分钟阅读

Tauri构建打包桌面应用

本节目标:学完能用一条命令把 Tauri 项目编译成安装包,并说清 Windows、macOS、Linux 各自的产物长什么样、放在哪个目录。

写代码时我们一直用 tauri dev,它在后台同时跑着前端开发服务器和 Rust 编译结果,改一行代码就能热更新,方便是方便,但这种「开发模式」下的程序只能在你的机器上用。想把它发给朋友、同事,或者上架到应用商店,就得走「构建(build)」这一步——把源码编译、打包成最终用户能直接安装运行的文件。

本章只讲「怎么打出一个包」,不展开签名、上架、自动更新这些进阶话题。你只要先建立起一个清晰的整体印象:一条命令、一个产物目录、三种平台各自的形态。

一条命令完成构建

构建的命令非常简单,在项目根目录(也就是包含 src-tauri 和前端代码的目录)执行:

npm run tauri build

如果你的 package.json 里没有配这个脚本,也可以直接调用 CLI:

npx tauri build

这条命令背后其实做了两件连贯的事。第一步,它会先执行你在 tauri.conf.json 里配置的 beforeBuildCommand,通常是前端的打包命令(比如 vite build),把 HTML/CSS/JS 编译成一组静态文件。第二步,它用 Rust 的 cargo 把后端编译成真正的原生可执行程序,再把前端静态文件和这个可执行程序一起塞进对应平台的安装包里。默认情况下,build 会自动完成打包(bundling),不需要你再额外敲命令。

Note

tauri build 只能在「当前系统对应的平台」上打出那个平台的包。在 Windows 上跑只能出 .msi/.exe,在 macOS 上跑只能出 .app/.dmg。跨平台出包要靠 CI(比如 GitHub Actions)或虚拟机,本机直接跨编译官方并不推荐。

产物放在哪里

不管哪个平台,构建结果都统一落在 src-tauri/target/ 目录下。理解这个目录结构,你才不会在打包完后到处找文件。

先看最底层:编译出来的「裸可执行文件」在 src-tauri/target/release/ 里。这里的 release 表示这是「发布模式」编译(开启了优化,体积小、跑得快),对应的是开发模式里的 debug 目录。

src-tauri/target/release/
├── your_app.exe          # Windows 下的裸可执行文件
├── your_app              # macOS / Linux 下的裸可执行文件
└── ...                   # 其他依赖的动态库

但光有这个裸文件还不够——它没有图标、没有安装向导、没有把前端资源打包进去。所以 Tauri 还会在 target/release/bundle/ 下生成「正式安装包」。这个 bundle 目录才是你真正要分发给用户的东西:

src-tauri/target/release/bundle/
├── windows/   # Windows 的 .msi 和 -setup.exe
├── macos/     # macOS 的 .app 和 .dmg
└── deb/       # Linux 的 .deb(以及 appimage/ 下的 AppImage)

简单记:target/release/ 是「半成品」,target/release/bundle/ 是「成品」。

Windows 的产物形态

在 Windows 上,Tauri 会生成两种常见的安装包形态。

第一种是 .msi(Microsoft Installer,微软安装包),它用 WiX Toolset 生成,是 Windows 上最标准、最容易被企业分发和静默安装的安装包。需要注意,.msi 只能在 Windows 上构建,因为 WiX 工具链本身只跑在 Windows。

第二种是 -setup.exe,比如 your_app-setup.exe,它用 NSIS 工具生成。相比 .msi.exe 安装包的优势是可以做「双击即装、一路下一步」的向导界面,对用户更友好。它还支持「当前用户安装」还是「所有用户安装」等模式。

Warning

构建 .msi 时,部分 Windows 系统需要开启「VBSCRIPT」可选功能,否则会报 failed to run light.exe 之类的错误。遇到这种情况,去「设置 → 应用 → 可选功能 → 更多 Windows 功能」里勾上它即可。

Windows 上还藏着一个细节:Tauri 应用依赖系统自带的 WebView2 运行环境来渲染界面。从 Windows 10(2018 年 4 月更新)和 Windows 11 开始,WebView2 已经是系统的一部分;但在更老的系统上,安装包会帮你自动下载它。如果你要做离线安装,可以在 tauri.conf.json 里把 bundle.windows.webviewInstallMode 改成 offlineInstaller,代价是安装包体积会大出约 127 MB。

macOS 的产物形态

macOS 上最常见的两种形态是 .app.dmg

.app 是「应用程序包(App Bundle)」,本质上是一个特殊结构的文件夹,双击就能运行。它可以直接拷贝到「应用程序」文件夹里使用。

.dmg(Apple Disk Image,苹果磁盘映像)则是最常见的「商店外分发」方式。用户双击 .dmg 后,会弹出一个窗口,左边是你的 App 图标,右边是「应用程序」文件夹图标,把 App 拖过去就完成安装——这正是 macOS 用户最熟悉的交互。

# macOS 上构建,产物在 src-tauri/target/release/bundle/macos/
npx tauri build

你可以微调 .dmg 的安装窗口,比如设置背景图、窗口大小、图标位置,都用 tauri.conf.json 里的 bundle.macOS.dmg 配置项。例如:

{
  "bundle": {
    "macOS": {
      "dmg": {
        "windowSize": { "width": 800, "height": 600 }
      }
    }
  }
}
Tip

无论是 macOS 还是 Linux,图形界面程序默认读不到你 shell 配置文件(.bashrc/.zshrc)里的 $PATH 环境变量。如果你的程序需要调用系统命令,记得用 Tauri 官方的 fix-path-env-rs 这个 crate 来修正,否则可能找不到命令。

Linux 的产物形态

Linux 的发行版太多,Tauri 提供了好几种打包格式,最常用的是两种。

第一种是 .deb(Debian 包),适用于 Ubuntu、Debian 以及衍生系统(如 Linux Mint)。用系统的包管理器就能安装,也会自动处理依赖。产物在 target/release/bundle/deb/

第二种是 AppImage,它是一种「不依赖系统、自带一切」的格式。用户拿到 YourApp.AppImage 后,只要加个可执行权限就能直接跑,不用安装:

chmod a+x YourApp.AppImage
./YourApp.AppImage

AppImage 的好处是「一个文件通吃大多数发行版」,代价是体积偏大(轻松到 70 MB 以上)。另外还有 rpm(Fedora 系)、flatpaksnap 等格式可选。

Note

AppImage 对「底层系统版本」比较敏感。官方建议在一个较老的系统(如 Ubuntu 22.04)上构建,这样打出来的包在更新的系统上也能跑。反之,在新系统上构建可能要求用户系统有更新的 glibc,导致在老系统上报 GLIBC_2.xx not found 的错误。

版本号从哪来

你打出来的包,文件名里会带版本号(比如 your_app_0.1.0_x64.msi)。这个版本号默认取自 tauri.conf.json 里的 version 字段;如果你没在配置里写,Tauri 会退而求其次,去读 src-tauri/Cargo.tomlpackage.version 的值。

{
  "version": "0.1.0"
}

所以日常迭代时,记得在发版前把版本号改对,避免用户手里出现两个同名却不同内容的安装包。

关于代码签名

最后提一句,但不在本章展开:大多数平台(尤其 macOS 和 Windows)都要求安装包经过「代码签名(code signing)」,用来证明这个软件确实出自你、没被篡改。没签名的 macOS 包会被系统直接拦下,没签名的 Windows 包会弹出吓人的安全警告。签名需要你申请开发者证书并配置到构建流程里。先记住「打包」和「签名」是两件事,签名是打包之上的一层保障,后续章节会专门讲。

小结

至此,你已经知道怎么把项目变成一个能发出去的安装包了。我们学会了用 tauri build 一条命令完成前端打包与 Rust release 编译,了解了产物位于 target/release/bundle/,并看清了 Windows(.msi / .exe)、macOS(.app / .dmg)、Linux(.deb / AppImage)各平台的安装包形态,以及版本号来源和代码签名的基本概念。下一章我们来看一个更本质的问题:Tauri 里前端页面和 Rust 后端到底是怎么「对话」的。