花了我将近一个星期才最终把 electron 自动更新走通,其中无数卧槽。整体方案是 electron 14 + electron-release-server + electron-updater + electron-builder. 现做个总结,分上下两部分,上部分讲服务器,下部分讲客户端+electron-updater以及如何打包。

electron-release-server

官网地址 GitHub - ArekSredzki/electron-release-server: A fully featured, self-hosted release server for electron applications, compatible with auto-updater.

nodejs 开发的服务。先说优点:使用简单,零配置,除了数据库和管理员账号密码;上传安装包自动生成 latest.yml ;支持 nsis 、squerrel 更新。

再说缺点:不支持range download,不支持差异比较下载;不支持 useMultipleRangeRequest . 对于使用 NSIS 方式不支持指定 flavor。偶尔还有内存泄漏(希望后续版本修复)。

尤其是不支持指定 flavour 非常难受。ers 只支持 flavour 为 default 的自动更新,在 NSIS 的方式下。话句话说,起一个服务只能用于 1 个APP的自动升级。第二个APP 怎么办?再起一个服务呗。。。

安装过程:

$ git clone https://github.com/ArekSredzki/electron-release-server.git
$ cd electron-release-server
## 配置文件
$ cd ./config
$ mv local.template local.js
## 修改 local.js
# 管理员账号密码
    static: {
      username: '账号',
      password: '密码'
    },
# 数据库
mysql: {...}
# session
session : {...}
# 文件目录
files: {
    dirname: 上传文件保存的位置
}
## 修改 config/env/development.js  config/env/production.js
# 使用 mysql 数据库。
models: {
    connection: 'mysql'
}
## 启动
npm run --prod

启动后自动创建数据库。

管理软件版本

electron中没有remote_electron

发布软件版本非常简单,就不一一赘述了。提一提容易踩坑的地方。

版本可用时间 Availability 的问题

默认为当前时间。可往后设置,但不能往前设置。但实际使用中发现问题,刚发布的版本总是检测不到。于是尝试在数据库把version.avalability 字段往前调了 8 小时,奇迹般能检测到了。所以有理由怀疑是时区差异的导致。这应该是个 bug。截至撰文时该 bug 没有修复。

 NSIS 下载的问题

使用 NSIS 方式更新可检测到更新,并且启动下载。可问题来了,实际下载的文件比真实的安装包大了好几倍,最要命还更新不了。细究发现是客户端使用了分段下载的方式(range download),而 ers 并不支持分段下载,因此每个请求都是下载完整的文件。那好办,关闭分段下载就可以了吧?不不不,electron-updater 并没有任何关闭 range download 的配置。#@¥%…!

再经过研究,nsis 的差异比较下载是依赖打包生成的 *.blockmap 文件的。于是发布新版本时不上传 blockmap 文件,结果 electron 顺利下载更新升级。只不过下载的是完整安装包。