自动更新

通过自托管的 electron-updater 更新源发布更新。

自动更新是受标志控制,默认开启。它使用 electron-updater 对接一个通用的 自托管更新源——没有需要运行的更新服务器,只需静态文件托管。应用会检查更新源, 且更新只在用户同意后才安装。

模型

electron-builder.yml 发布到一个通用 provider,其 URL 来自打包环境变量:

publish:
  provider: generic
  channel: latest
  url: ${env.UPDATE_SERVER_URL}

服务器上没有任何动态逻辑运行。每次发布,你都要把每个平台的一小组静态文件上传到 该 URL:

平台上传
macOSlatest-mac.yml.dmg(更新还需 .zip)及其 .blockmap
Windowslatest.yml、NSIS 的 -setup.exe 及其 .blockmap
Linuxlatest-linux.yml.AppImage

latest*.yml 元数据文件是 electron-updater 用来发现最新版本的依据;.blockmap 支持差分下载。UPDATE_SERVER_URLelectron-builder.env 中设置——参见 打包

应用内行为

lib/main/updater.tsUpdateService)刻意"同意优先"——它绝不在用户背后下载或 安装:

// lib/main/updater.ts
this.updater.autoDownload = false
this.updater.autoInstallOnAppQuit = false
  • 后台检查 在用户的自动更新设置开启时每 6 小时运行一次,并带一个 30 秒的启动延迟,使冷启动绝不会被网络阻塞(AUTO_UPDATE_POLL_INTERVAL_MS / AUTO_UPDATE_STARTUP_DELAY_MS)。
  • 状态 经由 update Conveyor 领域流向 /update 页面、更新设置标签页与托盘。 状态有:idlecheckingavailabledownloadingprogressdownloadederror
  • 手动检查/下载/安装 是更新页上的用户操作;发现更新会提示,按需下载,随后在 用户点击时执行 quitAndInstall()
  • 通道 从设置读取(applyChannel)。目前只发布稳定的 latest 通道; allowPrereleaseallowDowngrade 都被强制关闭。

更新源错误会被吞进已发布的 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 设置开启时运行(默认关闭), 因此关闭了标志的构建只是从不呈现更新控件。参见 环境变量

相关页面

On this page