Beace Lee

Beace Blog

Written by Beace Lee who lives and works in China building useful things. You should follow him on Twitter

有关Electron 在 Windows平台下的自动更新方案

January 10, 2019

背景

问题

electron-simple-updater 不支持 NSIS 安装包自动更新。

  • Windows 下无法触发自动更新
  • NSIS 与 Squirrel.Windows 互相纠缠不清

Windows 下两种安装包

NSIS

NSIS 是目前比较提倡的,electron-builder 默认选用的安装包方式。对于 NSIS 的安装包来说,如果直接用 electron-build 提供的 electron-autoupdater 自动更新是没有问题的,并且提供了更加友好的解决方案,例如下载进度等等。

但是由于我错误地选用了 electron-simple-updater,为了节省时间,这种几乎 0 配置的方式立马得到了我的青睐。于是乎就这么上去了。至今才发现,它只支持 Squirrel 不支持 NSIS 在 Windows 下的自动更新

这也印证了我之前一直好奇这个库的例子给的 Windows 下 update 字段的地址为什么不是一个文件的问题,原来它会去你指定的这个目录下找相应版本的 .unpkg 文件。

由于 NSIS 和 Squirrel 不能够相互转化,也就是说,之前用了 NSIS 的应用程序,我再用 Squirrel 包去更新,是不可行的。强行的话会报这样的错误。

20190108172704

Simplified auto-update is supported on Windows if you use the default NSIS target, but is not supported for Squirrel.Windows. You can easily migrate to NSIS.

相反,你如果之前用的是 Squirrel, 就可以顺利过渡到 NSIS。到这里可以得出一个结论,之前用 NSIS 的用户,需要其切换到 Squirrel 的方式。

Squirrel

Squirrel 是在 Electron 旧版本中最提倡的打包方式,但是官方已经说要抛弃它了。

Squirrel.Windows target is maintained, but deprecated. Please use nsis instead.

但是它还是会在目前阶段进行保留。它的更新是通过类似这样的文件来实现keymanager-0.21.2-full.nupkg 。那我们之前图省事选用的自动更新库 electron-simple-updater 帮我们做得事情,其实就是来也只支持 Squirrel 这种方式。

效果

经过反复测试,Squirrel 在 Windows 下的安装体验较差。几乎没有过程(可能我还没找到相应配置)。安装过程不用手动操作,双击后自动安装打开。效果如下。不过,可以生成 MSI 等格式的安装包,默认都是 .exe。

20190108232257

中间绿色的图片 GIF, 默认是build/install-spinner.gif 其实就是 Electron.exe 安装的场景,安装完之后立即启动。更新效果如下。

20190109022548

结论

NSIS 到 Squirrel 没有更好的方式过渡,只能强行覆盖版本。这是我一次技术选型的失误和对 Windows 平台研究不透彻导致的错误,上面也是 Windows 下更新不了的主要原因。所以还是代码(配置)的原因。

还是需要像上面那样解决去引导之前 Windows 用户。

还有另外一个解决方案,但是也少不了之前的破坏性更新。就是更新这块代码我们自己来写,这样就可以和最新的 NSIS 安装包方式保持一致,也跟 Electron 在之后的愿景一致,以及在体验上可以增加进度,更多友好的提示等等。

最后附上 NSIS 和 Squirrel 的打包配置。

Squirrel

"win": {
  "target": [
    "squirrel"
  ],
  "certificateSha1": "xxx",
  "rfc3161TimeStampServer": "http://timestamp.xxx.com/rfc3161TimeStampServer",
  "timeStampServer": "http://timestamp.xxx.com/timeStampServer.dll"
},
"squirrelWindows": {
  "iconUrl": "https://xxx/icon.ico",
  "artifactName": "${productName}-Setup-${version}.${ext}"
},

NSIS

"win": {
  "target": ["nsis"],
  "certificateSha1": "xxx",
  "rfc3161TimeStampServer": "http://timestamp.xxx.com/rfc3161TimeStampServer",
  "timeStampServer": "http://timestamp.xxx.com/timeStampServer.dll"
},
"nsis": {
  "oneClick": false,
  "allowToChangeInstallationDirectory": true,
  "artifactName": "${productName}-Setup-${version}.${ext}"
},