人人都会AI编程

16.2 官方 Updater 插件配置与使用

更新时间:2026-07-11

Tauri 官方提供了一个功能完善的自动更新插件 @tauri-apps/plugin-updater,它可以在后台静默检查新版本,下载更新包并引导用户安装,完美解决了桌面应用的版本分发难题。该插件支持全平台,并且能实现差分更新(只下载变化部分),节省用户流量和时间。

1. 准备工作:生成密钥对

更新包必须经过数字签名,以保证下载的安装包没有被篡改。你需要一对公钥和私钥:

  • 私钥你自行保管,用于在发版时对安装包签名(通常在 CI 环境中使用)。
  • 公钥则内置在应用中,用于在下载后验签。

使用 Tauri CLI 可以快速生成密钥对:

npx tauri signer generate -w ~/.tauri/myapp.key

这会在指定位置生成一个私钥文件(如 myapp.key),并输出对应的公钥字符串。复制这段公钥,稍后会用到。

注意:私钥绝对不能泄露,更不能打包到应用里。公钥是公开的,可以放心嵌入。

2. 准备更新服务器

更新插件需要从你的服务器拉取一个 JSON 描述文件。这个文件告诉应用最新的版本号、下载链接和签名信息。一个合法的 JSON 响应格式如下:

{
  "version": "1.2.0",
  "notes": "修复了若干 Bug,增加了新功能",
  "pub_date": "2025-03-15T12:00:00Z",
  "platforms": {
    "windows-x86_64": {
      "signature": "content of the signature file",
      "url": "https://your-cdn.com/app-v1.2.0_x64.msi.zip"
    },
    "darwin-aarch64": {
      "signature": "...",
      "url": "https://your-cdn.com/app-v1.2.0_aarch64.dmg"
    },
    "linux-x86_64": {
      "signature": "...",
      "url": "https://your-cdn.com/app-v1.2.0_amd64.AppImage.tar.gz"
    }
  }
}
  • version:必须严格遵循语义化版本,否则可能无法正确比对本机版本。
  • signature:安装包经过签名后生成的签名文件内容(通常是 .sig 文件)。
  • url:更新包的直链地址。Tauri 会自动下载这个文件。

3. 在应用中集成插件

安装插件包:

npm install @tauri-apps/plugin-updater

在 Rust 端,需要在 src-tauri/Cargo.toml 中添加:

[dependencies]
tauri-plugin-updater = "2"

并在 src-tauri/src/main.rs 中注册插件:

fn main() {
    tauri::Builder::default()
        .plugin(tauri_plugin_updater::Builder::new().build()) // 注册更新插件
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

tauri.conf.json 中配置更新端点和公钥:

{
  "plugins": {
    "updater": {
      "endpoints": [
        "https://your-server.com/update/check"
      ],
      "pubkey": "你之前生成的公钥"
    }
  }
}

多个 endpoints 可以用于容灾,按顺序尝试。

4. 在 JavaScript 中调用更新

插件提供了简洁的 API,你可以在应用中提供一个“检查更新”按钮,或应用启动时自动检查:

import { check } from '@tauri-apps/plugin-updater';

async function checkForUpdates() {
  try {
    const update = await check();
    if (update) {
      console.log(`发现新版本 ${update.version},更新说明:${update.body}`);
      // 下载并安装
      await update.downloadAndInstall((event) => {
        switch (event.event) {
          case 'Started':
            console.log('开始下载');
            break;
          case 'Progress':
            console.log(`下载进度: ${event.data.chunk_length}/${event.data.content_length}`);
            break;
          case 'Finished':
            console.log('下载完成');
            break;
        }
      });
      // 下载完成后,建议提示用户重启应用
      // 或者直接调用 relaunch
      await relaunch(); // 需要 import { relaunch } from '@tauri-apps/plugin-process'
    }
  } catch (error) {
    console.error('更新失败', error);
  }
}

downloadAndInstall 会自动验证签名、替换当前安装,并在下次启动时生效。大部分情况下,你只需要这一行就能完成更新流程。

5. 发布更新包并签名

在完成应用构建后,你需要对生成的安装包进行签名,然后将签名文件和安装包上传到服务器,并更新 JSON 端点。

例如,使用之前生成的私钥对 .msi 文件签名:

npx tauri signer sign -k ~/.tauri/myapp.key -f ./target/release/bundle/msi/app_1.2.0_x64.msi

命令会生成一个 .sig 签名文件,将其内容填入 JSON 的 signature 字段。

6. 注意事项

  • 版本号必须递增:插件会比较本地版本和服务器版本,只有后者更大才会提示更新。
  • 静默更新体验downloadAndInstall 是异步的,你可以在下载过程中显示进度条,完成后使用 relaunch() 让应用重启。
  • 错误处理:如果网络异常或签名验证失败,插件会主动抛出错误,建议用 try-catch 捕获并友好提示。
  • 差分更新:Tauri 更新插件支持差分更新,但需要在 tauri.conf.json 中额外配置 windows > installer > nsis > diffUpdater 或类似选项,且仅对部分打包格式有效(如 NSIS)。具体可查阅官方文档。

有了这套机制,你的 Tauri 应用就拥有了与商业软件相媲美的自动更新能力,用户总能第一时间享受到新功能和安全修复,而无需手动下载覆盖安装。