构建与打包初体验
本教程共 48 篇 · 第 13 篇 · 更新于 2026-08-09 · 约 7 分钟阅读
本节目标:学完能用一条命令把 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 系)、flatpak、snap 等格式可选。
NoteAppImage 对「底层系统版本」比较敏感。官方建议在一个较老的系统(如 Ubuntu 22.04)上构建,这样打出来的包在更新的系统上也能跑。反之,在新系统上构建可能要求用户系统有更新的 glibc,导致在老系统上报
GLIBC_2.xx not found的错误。
版本号从哪来
你打出来的包,文件名里会带版本号(比如 your_app_0.1.0_x64.msi)。这个版本号默认取自 tauri.conf.json 里的 version 字段;如果你没在配置里写,Tauri 会退而求其次,去读 src-tauri/Cargo.toml 里 package.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 后端到底是怎么「对话」的。