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();下载过程中弹窗不可关闭。