Electron Built-in AutoUpdater 踩坑记录

2,573 阅读5分钟

Electron Built-in AutoUpdater

因为之前做的 electron 应用开发使用的是 electron-packager 来对应用进行打包,根据官方文档的介绍,推荐使用内置的 AutoUpdater 来完成应用更新。

本文主要记录一下在使用和配置 electron 内置 AutoUpdater 过程中踩过的坑、解决了的以及没能解决的问题。虽然最后有一个问题没有能解决,并因此决定迁移去使用 electron-builder 来进行打包以及使用该项目中的自动更新。

**注:以下篇幅的前提是,你已经能成功给 windows/Mac 平台打包一个 electron app **

总览

通过查阅 electron 官方文档关于更新这一部分的介绍,我们可以看到整个更新的流程是这样的:

而如果不是走 electron-builder 的话,其实需要我们做的是两件事情:

  1. 配置一个服务器来 serve 更新
  2. 在客户端检索、下载和应用相应的更新

下面的篇幅里会按时间顺序,在这两个方面记录和还原在使用和配置 electron 内置 AutoUpdater 过程中踩到的坑。之后会再开一篇文章记录使用和配置 electron-builder 的过程以及两者之间的对比。

配置 一个服务器来 serve 更新

根据官方文档的介绍,electron 已经提供了几个选择:

  • Hazel - 使用 Github Releases 来管理和发布更新
  • Nuts - 使用 Github Releases 来管理和发布更新,并支持 private repository
  • electron-release-server - 自建服务器来管理和发布更新
  • Nucleus - maintained by Atlassian

由于我们的应用是走 Gitlab private 来做代码管理,并且暂无开源打算,所以我们会使用 electron-release-server 来管理应用的发布和更新。

配置 electron-release-server

配置 electron-release-server 的目的就是提供一个管理和提供我们 electron app 版本的服务器,以便我们的开发人员上传、管理 app 版本,以及客户端下载、更新版本。

配置的主要过程是根据 官方文档 进行的,下面将罗列我配置的步骤、遇到的坑以及解决的问题。我们也 fork 了这个项目并将相应更改应用到了这个 fork 中。

步骤

  1. 根据 部署文档 里的要求,将项目中的 config/local.template 复制成 config/local.js 作为项目配置文件
  2. 安装和配置 PostgreSQL,linux 环境的话根据操作系统(CentOS 或者 Ubuntu)都可以找到比较好的教程,这里我使用的是 Ditital Ocean 上的教程
  3. 根据 数据库文档 里的描述,将配置好的 PostgreSQL 参数按文档填入,需要注意的是要将配置文件里的 dirname 也填上。
  4. 保险起见,将 port 属性也 comment out
  5. 上述步骤做完后,可以运行命令 npm start 来在本地运行

以上是项目中提供的步骤,但实际运行中会发现有很多问题在文档中没有提到的:

docker.js 的问题

完成上述配置后,直接运行 npm start 会遇到这个错误:

Details:TypeError: Cannot read property 'split' of undefined
    at Object.<anonymous> (/Users/zhexuanliu/Desktop/mesh/electron-release-server/config/docker.js:28:67)

这里的问题是出在 config/docker.js 这个文件里。如果需要使用 Docker 的话,建议做的就是在 package.json 里将 DATABASE_URL 环境变量加上。

由于我们这里不打算使用 Docker,我们的处理方法就是将这个文件移除即可。

解决上面这个问题后,我能成功将这个项目跑起来,并通过 localhost:1337 来访问版本管理的界面,但接下来又遇到了一个问题:

上传应用文件一直失败

具体来说就是,通过版本管理的界面上传程序(可以参考 项目中的上传文档),按上述步骤部署后,不管是运行在本地还是服务器上,完成上传之后都会提示上传失败。

查阅了项目 issues 及各个社区都没有相关答案,我在 github 里也提了 issue,但无人回答。所以最后我更改了一下他的代码,来解决这个问题。

更改的内容我也 comment 在了这个 issue 中。


客户端检测并应用更新

完成上述步骤后, electron-release-server 遍基本部署完毕了。访问管理网页并上传 asset 后,asset 会自动立刻出于 serving 状态。

接下来我们要做的是去调整和配置客户端程序,以能够检测、应用更新。

CodeSign

由于客户端程序进行更新检测、应用都是需要走操作系统的更新流程的(Mac 的则是 AppStore),因此,对更新这个流程的测试只能在正式环境中进行,而且这个应用程序需要完成 Code Sign 这个步骤。具体内容可以参照文档

完成 Code Sign 的步骤在文档中的讲解和介绍都比较清晰了,其本质就是两步:

  1. 获取 signing certificate
  2. 使用 signing certificate 对应用进行签字认证

这里稍微提一下的是,由于我们发布的应用是要在 AppStore 外下载的,所以在苹果这里的签名,我们需要的是

- Developer ID Application: Developer ID Application: * (*)
- Developer ID Installer: Developer ID Installer: * (*)

获取到 signing certificate 后,只需要安装 electron-osx-sign 然后运行以下代码即可

electron-osx-sign <app>

CodeSign - Windows

待续

Detect and Apply Updates

这一部分比较简单,根据 electron 官方文档 里的记录操作即可。