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 注入。

相关推荐
techdashen1 天前
Cloudflare 如何把一个大型代理拆成三个小服务来提升可靠性
开发语言·rust
Rust研习社1 天前
使用 Tonic 构建高性能异步 gRPC 服务
开发语言·网络·后端·http·rust
DevilSeagull1 天前
Rust 方法语法:从定义到实践
开发语言·后端·rust
香山上的麻雀10081 天前
由 Rust 开发的能大幅降低LLM token消耗的高性能 CLI 代理工具 rtk
开发语言·后端·rust
zs宝来了1 天前
Rust 所有权系统:借用检查器与生命周期
rust·系统编程·内存安全
SoFarAway1 天前
基于Rust的ToDo列表实现
rust
skilllite作者1 天前
SkillLite Rust 沙箱与 AI Agent 自进化实战指南
开发语言·人工智能·后端·架构·rust
ejinxian2 天前
Rust Web框架三巨头Actix-web、Axum 、Rocket
开发语言·后端·rust
ithadoop2 天前
Solana入门:区块链新手速成指南(第二阶段:开发入门)
rust·web3·区块链·智能合约·solana