跳至主要內容

Tauri 應用打包與發佈:從開發到上架完全攻略

8 分鐘閱讀 2,100 字

當你的 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 會依序完成以下步驟:

  1. 編譯前端資源 — 執行你在 tauri.conf.json 中設定的 beforeBuildCommand(通常是 npm run build
  2. 編譯 Rust 後端 — 以 release 模式編譯,套用所有最佳化
  3. 打包安裝檔 — 根據當前作業系統產生對應的安裝格式

建置產物會放在 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.installModeboth 讓使用者選擇安裝給所有人或僅當前使用者
  • 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 的簽章流程比較繁瑣,需要:

  1. Apple Developer Program 會員資格(年費 $99 USD)
  2. 在 Keychain 中安裝 Developer ID 憑證
  3. 設定環境變數:
    • APPLE_SIGNING_IDENTITY:憑證名稱
    • APPLE_ID:Apple ID
    • APPLE_PASSWORD:App-specific password
    • APPLE_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 和程式碼簽章。這兩件事在專案初期做起來很輕鬆,但如果等到要發佈時才處理,往往會遇到一堆環境設定的坑。

分享這篇文章