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

相关推荐
Amos_Web11 小时前
Solana开发(1)- 核心概念扫盲篇&&扫雷篇
前端·rust·区块链
golang学习记16 小时前
VS Code官宣:全面支持Rust!
开发语言·vscode·后端·rust
叹一曲当时只道是寻常16 小时前
Tauri v2 + Rust 实现 MCP Inspector 桌面应用:进程管理、Token 捕获与跨平台踩坑全记录
开发语言·后端·rust
怪我冷i1 天前
Rust错误处理之unwrap
rust·cloudflare·unwrap
楚国的小隐士2 天前
为什么说Rust是对自闭症谱系人士友好的编程语言?
java·rust·编程·对比·自闭症·自闭症谱系障碍·神经多样性
Tomhex3 天前
Rust智能指针使用指南
rust
AI自动化工坊3 天前
Claw Code技术深度解析:Python+Rust混合架构的设计与实现
开发语言·人工智能·python·ai·架构·rust·开源
web前端进阶者3 天前
Rust初学知识点快速记忆
开发语言·后端·rust
一只幸运猫.4 天前
Rust实用工具特型-Clone
开发语言·后端·rust
咚为4 天前
深入浅出 Rust 内存顺序:从 CPU 重排到 Atomic Ordering
开发语言·后端·rust