自动更新
通过自托管的 electron-updater 更新源发布更新。
自动更新是受标志控制,默认开启。它使用 electron-updater 对接一个通用的 自托管更新源——没有需要运行的更新服务器,只需静态文件托管。应用会检查更新源, 且更新只在用户同意后才安装。
模型
electron-builder.yml 发布到一个通用 provider,其 URL 来自打包环境变量:
publish:
provider: generic
channel: latest
url: ${env.UPDATE_SERVER_URL}服务器上没有任何动态逻辑运行。每次发布,你都要把每个平台的一小组静态文件上传到 该 URL:
| 平台 | 上传 |
|---|---|
| macOS | latest-mac.yml、.dmg(更新还需 .zip)及其 .blockmap |
| Windows | latest.yml、NSIS 的 -setup.exe 及其 .blockmap |
| Linux | latest-linux.yml 与 .AppImage |
latest*.yml 元数据文件是 electron-updater 用来发现最新版本的依据;.blockmap
支持差分下载。UPDATE_SERVER_URL 在 electron-builder.env 中设置——参见
打包。
应用内行为
lib/main/updater.ts(UpdateService)刻意"同意优先"——它绝不在用户背后下载或
安装:
// lib/main/updater.ts
this.updater.autoDownload = false
this.updater.autoInstallOnAppQuit = false- 后台检查 在用户的自动更新设置开启时每 6 小时运行一次,并带一个
30 秒的启动延迟,使冷启动绝不会被网络阻塞(
AUTO_UPDATE_POLL_INTERVAL_MS/AUTO_UPDATE_STARTUP_DELAY_MS)。 - 状态 经由
updateConveyor 领域流向/update页面、更新设置标签页与托盘。 状态有:idle、checking、available、downloading、progress、downloaded、error。 - 手动检查/下载/安装 是更新页上的用户操作;发现更新会提示,按需下载,随后在
用户点击时执行
quitAndInstall()。 - 通道 从设置读取(
applyChannel)。目前只发布稳定的latest通道;allowPrerelease与allowDowngrade都被强制关闭。
更新源错误会被吞进已发布的 error 状态而非抛出,因此不可达的更新源在 UI 中表现
为一条消息,绝不会崩溃。
签名是前提
未签名的构建无法可靠地自更新:
- macOS 更新需要签名 + 公证的构建——Gatekeeper 会拒绝未签名的替换。
- Windows 强烈建议签名;未签名的更新会触发 SmartScreen。
在生产中依赖自动更新之前,先在打包中配置好签名。
发布流程
提升版本号
递增 package.json 中的 version。
构建带签名的安装包
在每个平台(或 CI)上运行 pnpm build:mac|win|linux,并设置签名/公证凭据。
上传到更新源
把安装包 + latest*.yml + .blockmap 文件复制到 UPDATE_SERVER_URL。
验证
启动一个较旧的安装,确认它能发现新版本并更新。
仓库附带一个 .github/workflows/release.yml,它正是自动化了这一切:在 v* 标签
上,它以矩阵方式为全部三个平台构建带签名/公证的安装包,并把它们(连同 latest
通道元数据)rsync 到更新源。其所有密钥都是可选的,未设置时会优雅降级。
关闭它
设置 VITE_AUTO_UPDATE_ENABLED=false 可剥除更新 UI——更新设置标签页与
/update 路由界面会消失(直接访问该路由仍能解析)。主进程的 UpdateService
仍会被构造,但其后台调度器只在用户的 autoUpdate 设置开启时运行(默认关闭),
因此关闭了标志的构建只是从不呈现更新控件。参见
环境变量。
