Tauri 應用打包與發佈:從開發到上架完全攻略
當你的 Tauri 應用在開發環境跑得很順,下一步自然是:怎麼把它交到使用者手上?打包桌面應用不像發佈網頁那麼單純——你得面對不同作業系統的安裝格式、程式碼簽章、自動更新,還有「為什麼我的安裝檔這麼大」的靈魂拷問。
這篇文章會帶你走完 Tauri 應用從建置到發佈的完整流程,包含各平台打包細節、簽章設定、自動更新機制,以及 CI/CD 自動化建置。
建置流程概覽
Tauri 的建置指令很直觀:
# 開發模式(熱重載)
cargo tauri dev
# 正式建置
cargo tauri build
# 指定目標平台格式
cargo tauri build --bundles deb,appimage
# 建置 debug 版本(保留除錯資訊)
cargo tauri build --debug執行 cargo tauri build 後,Tauri 會依序完成以下步驟:
- 編譯前端資源 — 執行你在
tauri.conf.json中設定的beforeBuildCommand(通常是npm run build) - 編譯 Rust 後端 — 以 release 模式編譯,套用所有最佳化
- 打包安裝檔 — 根據當前作業系統產生對應的安裝格式
建置產物會放在 src-tauri/target/release/bundle/ 目錄下。值得注意的是,Tauri 只能為當前作業系統建置安裝檔——你沒辦法在 macOS 上直接打包 Windows 的 MSI,這也是為什麼後面會介紹 GitHub Actions 的原因。
各平台打包格式
Windows
- NSIS(預設):最常見的 Windows 安裝精靈,支援自訂安裝路徑、開始選單捷徑
- MSI:企業環境偏好的格式,適合透過群組原則(GPO)部署
macOS
- DMG(預設):經典的磁碟映像檔,使用者拖曳安裝
- App Bundle:
.app目錄,可直接執行
Linux
- deb:Debian/Ubuntu 系列的套件格式
- AppImage:無需安裝,下載即可執行的通用格式
- rpm:Fedora/RHEL 系列的套件格式
Bundle 設定詳解
tauri.conf.json 中的 bundle 區塊控制打包行為。以下是一個涵蓋常見設定的範例:
{
"bundle": {
"active": true,
"targets": "all",
"identifier": "com.mycompany.myapp",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": ["assets/*"],
"copyright": "Copyright © 2026 MyCompany",
"shortDescription": "一個很棒的桌面應用",
"longDescription": "這是一個用 Tauri 打造的桌面應用程式...",
"windows": {
"nsis": {
"installMode": "both",
"languages": ["English", "ChineseTraditional"],
"displayLanguageSelector": true
},
"webviewInstallMode": {
"type": "downloadBootstrapper"
}
},
"macOS": {
"minimumSystemVersion": "10.15",
"frameworks": [],
"signingIdentity": null,
"entitlements": null
},
"linux": {
"deb": {
"depends": ["libwebkit2gtk-4.1-0"],
"section": "utils"
},
"appimage": {
"bundleMediaFramework": true
}
}
}
}幾個重要設定說明:
- identifier:應用程式的唯一識別碼,macOS 的 Bundle ID 和 Linux 的套件名稱都會用到,建議用反向域名格式
- resources:需要隨安裝檔一起分發的額外檔案(如設定檔、資料庫範本)
- windows.nsis.installMode:
both讓使用者選擇安裝給所有人或僅當前使用者 - windows.webviewInstallMode:控制 WebView2 的安裝策略,
downloadBootstrapper會在需要時自動下載
應用圖示設定
Tauri CLI 內建了圖示產生工具,能從一張原始圖片自動產生所有平台需要的格式和尺寸:
cargo tauri icon path/to/app-icon.png這個指令會從你提供的圖片(建議至少 1024x1024 像素的 PNG)產生:
- Windows 用的
.ico檔 - macOS 用的
.icns檔 - 各種尺寸的 PNG 檔(32x32、128x128、256x256 等)
產生的圖示會自動放到 src-tauri/icons/ 目錄,而 tauri.conf.json 的預設設定已經指向這個位置。
程式碼簽章
沒有簽章的應用程式在各平台都會遇到阻礙:Windows 會跳出 SmartScreen 警告,macOS 直接拒絕開啟,使用者體驗很差。
Windows(Authenticode)
你需要一張程式碼簽章憑證(Code Signing Certificate)。設定環境變數讓 Tauri 在建置時自動簽章:
TAURI_SIGNING_PRIVATE_KEY:私鑰內容或路徑TAURI_SIGNING_PRIVATE_KEY_PASSWORD:私鑰密碼
目前主流做法是使用 EV(Extended Validation)憑證搭配硬體 token,或是透過雲端簽章服務如 Azure Trusted Signing。
macOS(codesign + notarization)
macOS 的簽章流程比較繁瑣,需要:
- Apple Developer Program 會員資格(年費 $99 USD)
- 在 Keychain 中安裝 Developer ID 憑證
- 設定環境變數:
APPLE_SIGNING_IDENTITY:憑證名稱APPLE_ID:Apple IDAPPLE_PASSWORD:App-specific passwordAPPLE_TEAM_ID:開發者團隊 ID
Tauri 在建置時會自動處理 codesign 和 notarization(公證)。公證是 macOS 10.15 之後的強制要求,Apple 會遠端掃描你的應用確認沒有惡意程式碼。
自動更新機制
Tauri 2.0 透過 @tauri-apps/plugin-updater 插件提供自動更新功能。更新流程是:應用啟動時檢查遠端的 JSON 端點,比對版本號,如果有新版就下載並安裝。
首先安裝插件:
cargo add tauri-plugin-updater
npm install @tauri-apps/plugin-updater在 tauri.conf.json 中設定更新端點:
{
"plugins": {
"updater": {
"endpoints": [
"https://releases.myapp.com/{{target}}/{{arch}}/{{current_version}}"
],
"pubkey": "YOUR_PUBLIC_KEY_HERE"
}
}
}端點需要回傳一個 JSON,包含版本號、下載 URL 和簽章。你可以自己架設這個端點,或是使用 GitHub Releases 搭配 tauri-action 自動產生。
pubkey 是用來驗證更新檔案完整性的公鑰,可以用 cargo tauri signer generate 產生金鑰對。這確保了即使有人竄改了你的更新伺服器,使用者也不會安裝到被動過手腳的版本。
GitHub Actions CI/CD 自動建置
因為 Tauri 無法跨平台編譯,用 CI/CD 在三個作業系統上同時建置是標準做法。Tauri 官方提供了 tauri-apps/tauri-action 這個 GitHub Action,設定起來非常方便:
name: Release
on:
push:
tags:
- "v*"
jobs:
release:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- platform: ubuntu-22.04
args: ""
- platform: windows-latest
args: ""
- platform: macos-latest
args: "--target aarch64-apple-darwin"
- platform: macos-latest
args: "--target x86_64-apple-darwin"
runs-on: ${{ matrix.platform }}
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- 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
- name: Install frontend dependencies
run: npm install
- uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
with:
tagName: v__VERSION__
releaseName: "App v__VERSION__"
releaseBody: "See the assets for download links."
releaseDraft: true
prerelease: false
args: ${{ matrix.args }}這個工作流程會在你推送 v* 格式的 tag 時觸發,同時在 Ubuntu、Windows 和 macOS 上建置。macOS 需要分別建置 Intel(x86_64)和 Apple Silicon(aarch64)版本。tauri-action 會自動把建置產物上傳到 GitHub Release。
記得在 GitHub Repository 的 Secrets 中設定簽章用的私鑰和密碼。
檔案大小最佳化
Tauri 的優勢之一就是小巧的安裝檔,但還是有一些技巧可以進一步壓縮:
Rust 編譯最佳化
在 src-tauri/Cargo.toml 中加入:
[profile.release]
strip = true # 移除除錯符號
lto = true # 啟用 Link-Time Optimization
opt-level = "s" # 以檔案大小為優先最佳化
codegen-units = 1 # 犧牲編譯速度換取更好的最佳化
panic = "abort" # 移除 panic unwind 的額外程式碼前端最佳化
- 使用 Tree-shaking 友善的打包工具(Vite 預設就很好)
- 壓縮圖片資源,考慮使用 WebP 或 AVIF 格式
- 啟用程式碼分割(Code Splitting),但注意桌面應用不像網頁那麼需要
- 檢查並移除未使用的依賴套件
實際大小參考
一個典型的 Tauri 應用安裝檔大小:
- Windows NSIS:約 3-6 MB
- macOS DMG:約 5-10 MB
- Linux AppImage:約 8-15 MB
相比 Electron 動輒 80-150 MB 的安裝檔,這個差距是非常顯著的。
常見問題排除
- Windows SmartScreen 警告:需要 EV 憑證或累積足夠的安裝量建立信譽
- macOS 無法開啟:檢查 codesign 和 notarization 是否都完成,用
spctl --assess驗證 - Linux 缺少依賴:確認
deb.depends列出了所有必要的系統函式庫 - 更新失敗:確認 pubkey 正確,端點回傳的 JSON 格式符合規範
總結
Tauri 的打包與發佈流程雖然涉及不少細節,但整體設計是相當友善的。透過 tauri.conf.json 集中管理設定、用 GitHub Actions 實現跨平台自動建置、搭配 Updater 插件處理版本更新——這套組合拳足以應付大多數桌面應用的發佈需求。
最重要的建議:盡早設定 CI/CD 和程式碼簽章。這兩件事在專案初期做起來很輕鬆,但如果等到要發佈時才處理,往往會遇到一堆環境設定的坑。
分享這篇文章