跳到正文
灵动桌面框架
Esc
本栏目菜单

Updater 更新插件

Updater 插件支持应用检查更新和下载安装。框架已注册插件(tauri_plugin_updater::Builder::new().build())并授予 updater:default 权限(检查、下载、安装全流程)。

框架不会在启动时自动检查:入口在设置页的「检查更新」按钮,发现新版本后弹出更新弹窗,下载完成后点「重启应用」生效。需要启动即检查,可在应用初始化时调用同一个 updaterApi.checkUpdate()。

配置更新源

框架模板里的配置是占位符,衍生项目发布前必须替换:

// src-tauri/tauri.conf.json
{
  "plugins": {
    "updater": {
      "endpoints": ["https://gitee.com/<用户名>/<项目名>-release/raw/master/update.json"],
      "pubkey": "YOUR_UPDATER_PUBKEY_HERE"
    }
  },
  "bundle": {
    "createUpdaterArtifacts": "v1Compatible"
  }
}
配置项说明
endpoints更新清单地址。模板约定为 release 仓库里的静态 update.json(Gitee raw 链接),由发布流程生成并推送
pubkey签名公钥,用 pnpm tauri signer generate 生成;对应私钥在 CI 中以 TAURI_SIGNING_PRIVATE_KEY 注入用于签名安装包
createUpdaterArtifacts打包时同时产出更新包与 .sig 签名文件

占位符不替换时:endpoints 指向不存在的地址,检查更新会直接失败;pubkey 仍是 YOUR_UPDATER_PUBKEY_HERE 时,下载完成后的签名校验无法通过,安装会失败。发布与生成 update.json 的完整流程见 应用更新。

前端检查更新

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

async function checkForUpdate() {
  const update = await check()
  if (update) {
    console.log(`发现新版本: ${update.version}`)
    // 下载并安装
    await update.downloadAndInstall()
    // 重启应用
    await relaunch()
  }
}

封装到 API 层

框架的封装很薄,只透传 check(),返回插件原生的 Update 对象(无新版本时为 null):

// src/lib/api/updater.ts
import { check } from '@tauri-apps/plugin-updater'

/** 更新相关 API */
export const updaterApi = {
  checkUpdate: () => check(),
}

updaterApi 已从 src/lib/api/index.ts 统一导出。

在页面中使用

设置页(src/pages/settings/index.tsx)负责检查,弹窗组件 UpdateModal(src/components/ui/UpdateModal.tsx)负责下载进度与重启:

import { useState } from 'react'
import { Button, message } from 'antd'
import type { Update } from '@tauri-apps/plugin-updater'
import { updaterApi } from '@/lib/api'
import { UpdateModal } from '@/components/ui/UpdateModal'

function UpdateChecker() {
  const [checking, setChecking] = useState(false)
  const [update, setUpdate] = useState<Update | null>(null)
  const [open, setOpen] = useState(false)

  async function handleCheckUpdate() {
    setChecking(true)
    try {
      const result = await updaterApi.checkUpdate()
      if (result) {
        setUpdate(result)
        setOpen(true)
      } else {
        message.success('当前已是最新版本')
      }
    } catch (e) {
      message.warning(`检查更新失败: ${String(e)}`)
    } finally {
      setChecking(false)
    }
  }

  return (
    <>
      <Button loading={checking} onClick={handleCheckUpdate}>检查更新</Button>
      <UpdateModal open={open} onClose={() => setOpen(false)} update={update} />
    </>
  )
}

UpdateModal 内部调用 update.downloadAndInstall(onEvent),根据 Started / Progress / Finished 事件显示下载进度(已下载 / 总大小),完成后由用户点「重启应用」触发 relaunch();下载过程中弹窗不可关闭。