Tauri 中实现自更新(Auto Update)

在 Tauri 中实现自更新(Auto Update)主要依赖于官方的 updater 插件。该机制通过数字签名确保更新包的安全性,防止篡改。

以下是基于 Tauri v2(当前主流版本)的完整自更新实施步骤:

1. 安装 Updater 插件

首先,你需要将 updater 插件添加到你的 Tauri 项目中。在项目根目录运行:

bash 复制代码
# 如果使用 pnpm
pnpm tauri add updater

# 如果使用 npm
npm run tauri add updater

# 如果使用 yarn
yarn tauri add updater

2. 生成签名密钥

Tauri 强制要求对更新包进行签名。你需要生成一对密钥(公钥和私钥):

  • 私钥:用于在构建时签名更新包(必须严格保密,不能上传到代码仓库)。
  • 公钥:嵌入到应用程序中,用于验证下载的安装包签名。

运行以下命令生成密钥(会将密钥保存在 ~/.tauri/ 目录下):

bash 复制代码
pnpm tauri signer generate -w ~/.tauri/key.key
# 或者指定密码保护私钥
pnpm tauri signer generate -w ~/.tauri/key.key --password

执行后,请记下生成的 公钥 (Public Key) 字符串。

3. 配置 tauri.conf.json

打开 src-tauri/tauri.conf.json,在 plugins 或根配置中添加 updater 配置项(Tauri v2 结构可能略有不同,通常在 plugins.updater 下):

json 复制代码
{
  "plugins": {
    "updater": {
      "active": true,
      "endpoints": [
        "https://your-server.com/update/{{target}}/{{arch}}/{{current_version}}"
      ],
      "dialog": true, 
      "pubkey": "YOUR_GENERATED_PUBLIC_KEY_HERE"
    }
  },
  "bundle": {
    "windows": {
      "certificateThumbprint": null,
      "digestAlgorithm": "sha256",
      "timestampUrl": ""
    }
  }
}
  • endpoints: 你的更新服务器地址。Tauri 会自动替换 {``{target}} (如 windows-x86_64), {``{arch}}, {``{current_version}} 等变量。
  • dialog: 设置为 true 会使用系统原生弹窗提示用户更新;设置为 false 则需在前端自行编写 UI 逻辑。
  • pubkey: 填入第2步生成的公钥。

4. 后端服务器返回格式

你的更新服务器需要返回一个 JSON 响应,告诉客户端是否有新版本。标准格式如下:

json 复制代码
{
  "version": "1.0.1",
  "notes": "修复了若干Bug,提升了性能",
  "pub_date": "2026-02-24T10:00:00Z",
  "platforms": {
    "windows-x86_64": {
      "signature": "SIGNATURE_GENERATED_DURING_BUILD",
      "url": "https://your-server.com/downloads/app-v1.0.1.msi"
    },
    "darwin-aarch64": {
      "signature": "...",
      "url": "..."
    }
  }
}

注意:signature 字段通常需要在构建后获取,或者由构建脚本自动上传到服务器。如果是简单的静态托管,可以使用 GitHub Releases 配合第三方服务(如 UpgradeLink)或直接编写脚本生成此 JSON。

5. 前端调用更新逻辑

如果配置了 "dialog": true,Tauri 会在检测到更新时自动弹窗。如果需要自定义 UI,可以在前端(React/Vue/Svelte等)调用 API:

typescript 复制代码
import { checkUpdate, installUpdate } from '@tauri-apps/plugin-updater';

async function updateApp() {
  const update = await checkUpdate();
  
  if (update?.available) {
    console.log(`发现新版本: ${update.version}`);
    // 可以在此显示自定义UI
    try {
      await installUpdate();
      // 安装完成后通常需要重启应用
      // import { relaunch } from '@tauri-apps/plugin-process';
      // await relaunch();
    } catch (e) {
      console.error('更新失败', e);
    }
  } else {
    console.log('已是最新版本');
  }
}

6. 构建并签名发布

在构建应用时,必须提供私钥以便对安装包进行签名。可以通过环境变量设置:

Linux/macOS:

bash 复制代码
export TAURI_PRIVATE_KEY=$(cat ~/.tauri/key.key)
# 如果设置了密码
export TAURI_KEY_PASSWORD="your_password"
pnpm tauri build

Windows (PowerShell):

powershell 复制代码
$env:TAURI_PRIVATE_KEY = Get-Content ~/.tauri/key.key -Raw
# 如果设置了密码
$env:TAURI_KEY_PASSWORD = "your_password"
pnpm tauri build

构建完成后,src-tauri/target/release/bundle 目录下会生成已签名的安装包(.msi, .app.tar.gz 等)以及对应的 .sig 签名文件。你需要将这些文件和第4步提到的 JSON 更新描述文件部署到你的服务器上。

常见方案推荐

对于个人开发者或小团队,维护一个完整的更新服务器比较麻烦,推荐以下两种简便方案:

  1. GitHub Releases + 第三方服务 :将安装包上传到 GitHub Releases,使用如 UpgradeLinkTauri Updates 等托管服务来生成符合格式的 JSON 和签名管理。
  2. 对象存储 (OSS/S3):将安装包上传到阿里云 OSS 或 AWS S3,自己编写一个简单的云函数或静态 JSON 文件来返回更新信息(需注意签名值的获取,通常需要在 CI/CD 流程中提取构建后的签名值并更新到 JSON 文件中)。

安全提示 :切勿将 key.key (私钥) 提交到 Git 仓库!建议在 CI/CD 流程中通过 Secrets 注入。

相关推荐
土豆12501 小时前
Rust宏编程完全指南:用元编程解锁Rust的终极力量
rust·编程语言
小杍随笔5 小时前
【Rust 语言编程知识与应用:基础数据类型详解】
开发语言·后端·rust
小杍随笔11 小时前
【Rust 语言编程知识与应用:自定义数据类型详解】
开发语言·后端·rust
咚为12 小时前
Rust 跨平台编译实战:从手动配置到 Cross 容器化
开发语言·后端·rust
幸福指北15 小时前
我用 Tauri + Vue 3 + Rust 开发了一款跨平台网络连接监控工具Portview,性能炸裂!
前端·网络·vue.js·tcp/ip·rust
咚为15 小时前
深入浅出 Rust FFI:从内存安全到二进制兼容
开发语言·安全·rust
a11177618 小时前
剪切板助手TieZ(开源项目rust)
rust·开源·剪切板
盒马盒马1 天前
Rust:迭代器
开发语言·后端·rust
吾爱iis2 天前
OTOClaw - 智能龙虾,一键部署OpenClaw龙虾、轻松养龙虾
vue·tauri·openclaw·otoclaw
Source.Liu2 天前
【Iced】stream.rs文件
rust·iced