自动更新
为 01MVP Desktop 配置 Tauri updater、签名产物和更新端点
桌面自动更新要三样东西:签名后的安装产物、可访问的更新端点、应用内 updater 配置。模板默认保留 TypeScript wrapper,但没启用 Rust updater plugin——发布端点和签名公钥得由具体产品提供。
官方文档:Tauri updater
用户需要先准备什么
自动更新上线前,先把这些问题定下来:
| 准备项 | 用途 | 备注 |
|---|---|---|
| 更新域名 | App 请求更新端点 | 建议使用稳定独立域名或子路径 |
| 安装包存储 | 存放各平台 release assets | R2、S3、GitHub Releases 或自建下载服务都可以 |
| updater key pair | 签名和验证更新包 | 私钥只放 CI secret;公钥写进 App 配置 |
| 版本策略 | 决定什么时候提示更新 | 至少区分 preview 和 production |
| 回滚方案 | 新版本出问题时快速停止分发 | endpoint 可以返回旧版本或 no update |
| 发布说明 | 给用户说明变化 | 也用于“检查更新”结果页 |
如果还没有稳定下载域名和 updater 私钥,先保留“检查更新不可用”的状态。不要用临时 URL 做生产更新源。
为什么模板不默认开 updater
自动更新不只是前端按一个按钮。它需要:
- 真实发布域名
- 签名公钥和私钥
- 每个平台的安装包
- 更新 manifest 或 endpoint
- 版本号策略
- 回滚和失败处理
如果模板提前写个假 endpoint,应用启动时反而容易挂。当前做法是 src/runtime/updater.ts 保留入口;未配置时返回 unavailable。
启用 updater 要改哪里
要改这些:
| 文件 | 作用 |
|---|---|
products/01mvp/apps/desktop/package.json | 保留 @tauri-apps/plugin-updater |
products/01mvp/apps/desktop/src-tauri/Cargo.toml | 添加 tauri-plugin-updater |
products/01mvp/apps/desktop/src-tauri/src/lib.rs | 注册 updater plugin |
products/01mvp/apps/desktop/src-tauri/capabilities/default.json | 开放 updater 权限 |
products/01mvp/apps/desktop/src-tauri/tauri.conf.json | 配置 endpoints、pubkey、更新产物 |
| 发布服务 | 提供 update endpoint 和安装包下载地址 |
生成 updater key
Tauri updater 需要签名密钥。按官方命令生成:
pnpm exec tauri signer generate --write-keys私钥只放在 CI secret 或本机安全位置。公钥写进 tauri.conf.json。
别把 updater 私钥提交到仓库。
配置 Tauri
示例结构:
{
"bundle": {
"createUpdaterArtifacts": true
},
"plugins": {
"updater": {
"endpoints": [
"https://updates.example.com/{{target}}/{{arch}}/{{current_version}}"
],
"pubkey": "YOUR_PUBLIC_KEY"
}
}
}endpoint 可以是静态 JSON,也可以是服务端 API。推荐服务端 API,它能按平台、架构、渠道和版本返回不同结果。
更新端点该返回什么
至少要能表达:
- 是否有新版本
- 新版本号
- 下载 URL
- 签名
- release notes
- 平台和架构
发布服务放 Cloudflare Worker、Hono API 或其他后端都行。安装包放 R2、S3、GitHub Releases 或对象存储。闭源产品用 Worker + R2 更容易控制访问、缓存、灰度和下载统计。
应用内检查更新
模板入口在:
products/01mvp/apps/desktop/src/runtime/updater.ts启用 Rust updater plugin 后,checkForDesktopUpdate() 可以返回:
| status | 含义 |
|---|---|
available | 有新版本 |
none | 当前版本已是最新 |
unavailable | 当前构建没有配置 updater |
failed | 检查失败 |
UI 先只提供”检查更新”按钮就够了。自动下载和安装等发布流程稳定后再加。
验收清单
启用自动更新后,至少验这些:
- 没有新版本时返回 up to date
- 有新版本时返回正确版本号和 notes
- 下载 URL 可访问
- 签名校验通过
- 旧版本能更新到新版本
- macOS、Windows、Linux 分别验证
- endpoint 失败时 UI 不崩溃
- 没有配置 updater 的开发构建能正常启动
自动化边界
CI 可以负责构建、签名、上传安装包、生成更新签名和发布 manifest。下面这些仍然需要用户先准备:
- updater 私钥放进 CI secret,不能进仓库
- 下载域名和对象存储已经可访问
- preview / production 的 endpoint 分开
- 旧版本安装包仍然能下载,方便回滚和对比测试
- 每次发布后用旧版本真实安装包验证“检查更新 -> 下载 -> 安装”
常见问题
为什么不能直接用私有 GitHub Release
用户机器上的桌面应用不该内置 GitHub token。私有 Release 直接当 updater 源会有认证和泄漏风险。更稳的做法是后端服务决定是否允许下载,再把短期可访问的安装包地址返回给客户端。
dev 构建需要自动更新吗
通常不需要。dev 构建主要用于调试。自动更新应该在 preview 或 production 渠道里测试。
updater 权限要一次性全开吗
先按需求开放。只做检查时,优先开放 check。等下载和安装流程准备好后,再开放完整权限。
这篇文档有问题?