利用 electron-builder 实现 electron app 的署名/打包/发布以及自动更新

news/2023/12/10 14:57:45
笔者系 electron-builder 贡献者之一(#12)

electron-builder 是什么

官方解释如下:

A complete solution to package and build a ready for distribution Electron app with “auto update” support out of the box

简单来说,electron-builder 就是一个可以将 electron app 打包成安装器 (installer),以及可以为 electron app 提供自动更新功能的全家桶。

接下来分别介绍 electron-builder 的两大功能:署名/打包/发布 和 自动更新

署名/打包/发布流程

想要将开发完成的 app 署名打包成安装器 (installer) 发布出去,需要进行以下几个步骤

  • 署名
  • 打包
  • 发布

electron-builder 的强大之处在于,以上几个步骤可以一键完成,甚至包括打包成不同平台版本 (etc. macOS, windows...)

但是,在让 electron-builder 为我们完成以上步骤之前,它必须知道一系列信息才能进行署名/打包/发布一系列流程。它需要知道的信息有:

  • 署名:署名证书在哪里,以及使用署名证书的密码等信息
  • 打包:打包的安装器面向的平台,是 macOS, windows 还是 linux ,以及安装器的格式等等
  • 发布:要将打包好的安装器发布到的服务器,那么就需要和服务器进行链接的验证信息

配置署名环节所需信息

如果你进行署名打包的机器是 macOS 而且打包的安装器对应的平台也是 macOS 的话,electron-builder 会自动检测你 keychain 里面可用的署名证书然后自动使用,那么就不需要手动配置署名信息了。

要配置署名环节的各种信息,有两种方式(选其一即可,推荐在环境变量方式)

  • 在 package.json 里设置
  • 在环境变量中设置

在 package.json 里的设置方式

// 对于 windows 平台的安装器
"win": {"target": [{"signingHashAlgorithms": "sha1","sign": "********","certificationFile": "../../*****","certificatePassword": "******"}]
},// 对于 macOS 平台的安装器
"mac": {"identity": "****" // The name of certificate to use when signing.},

在环境变量中配置

Env NameDescription
CSC_LINKThe HTTPS link (or base64-encoded data, or file:// link, or local path) to certificate (.p12 or .pfx file). Shorthand ~/ is supported (home directory).
CSC_KEY_PASSWORDThe password to decrypt the certificate given in CSC_LINK.
CSC_NAMEmacOS-only Name of a certificate (to retrieve from login.keychain). Useful on a development machine (not on CI) if you have several identities (otherwise don't specify it).
CSC_IDENTITY_AUTO_DISCOVERYtrue or false. Defaults to true — on a macOS development machine valid and appropriate identity from your keychain will be automatically used.
CSC_KEYCHAINThe keychain name. Used if CSC_LINK is not specified. Defaults to system default keychain.

注意:如果你是在 macOS 上打包面向 windows 平台的安装器,必须增加两个不同的环境变量 WIN_CSC_LINK 和 WIN_CSC_KEY_PASSWORD

配置打包环节所需信息

所谓打包环节所需信息,就是指定安装器(installer)的一系列配置信息。比如说运行环境,安装器格式,版权信息,安装器命名等等。这些信息都是在 package.json 中配置。比如:

"win": {"target": [{"target": "nsis","arch": ["x64","ia32"],......}]
},"mac": {"category": "your.app.category.type","target": ["zip","dmg"],},

更多详细配置,请参考

  • macOS详细配置
  • Windows详细配置
  • Linux详细配置

配置发布环节所需信息

署名,打包完成后的安装器需要上传发布到服务器(比如说S3),那么electron-builder就需要将链接服务器的验证信息(比如账号/密码,或者各种 Token 等等)。

由于发布的服务器种类各异,所以针对不停的服务器,配置的方式不尽相同

Bintray

通过Bintray发布的话,需要一个 API key,这个API key 可以从用户主页获取到("Edit Your Profile" -> API Key),将这个 API key 配置到环境变量 BT_TOKEN 即可

GenericServer

Generic 方式是针对可以直接上传不需要验证的服务器,无需格外配置信息。

GithubOptions

使用GitHub发布服务器的话,也需要一个TOKEN,这个TOKEN可以在GitHub上创建,可以参考GitHub Token 创建方法。获取到这个Token之后,将它放到环境变量 GH_TOKEN 中既可。

S3Options

如果使用 Amazon S3 作为发布服务器的话,还需要额外安装一个 electron-publisher-s3 模块(可以通过npm 或者 yarn 来安装)

同样的使用 Amazon S3 也需要验证,在 AWS 上获取你的验证信息,获取到你在AWS上的 KEY ID 和 ACCESS_KEY 之后,然后分别放到环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 里面。或者你也可以放到 ~/.aws/credentials 里面。

SpacesOptions

如果你使用 DigitalOcean Spaces 作为发布服务器的话,获取到 access key 之后,然后在放到环境变量 DO_KEY_ID 和 DO_SECRET_KEY 里面即可

署名/打包/发布 一键完成

上面的信息都配置好了的话,运行以下命令

$ build --publish

即可一键完成 署名/打包/发布 流程

更多详细信息可以参考官网 CLI详细说明

自动更新功能

electron app 的自动更新方案,可以大概分为以下两种:

  • 有更新服务器 (with update server) 的方案
  • 无更新服务器(without update server)的方案

electron-updater 就是针对没有更新服务器的情况而生的解决方案。(PS:有更新服务器的解决方案,可以通过electron自带的autoUpdater来实现,具体的解决方案会在文章最后说明,在这里主要讲解electron-builder全家桶的使用方法)

在 electron-builder 中,这个叫做 electron-updater 的模块与 electron-builder 本体不同,它是一个 runtime-dependency ,也就是放在package.json的dependencies里面的一个模块(PS: 而 electron-builder 是放在devDependencies里面的)

electron-updater 功能强大之处在于,它支持多种无服务器自动更新方案。这里的无服务器并不是指的真的没有服务器。具体来说就是在这种方案里没有计算服务器 (eg. EC2),只有静态文件服务器 (eg. S3)

electron-updater 模块通过检测静态文件服务器上面的最新release版本号,将它与本地版本号进行对比,从而得知是否需要自动更新。

话不多说,我们直接来看代码

const electron = require("electron");
const updater = require("electron-updater");
const autoUpdater = updater.autoUpdater;autoUpdater.setFeedURL({provider: "generic", // 这里还可以是 github, s3, bintrayurl: "https://gitlab.com/_example_repo_/-/jobs/artifacts/master/raw/dist?job=build"
});autoUpdater.on('update-available', function (info) {console.log('Update available.');
});

仅用两行就完成了最基本的新版本的检测机制,更多详细的API可以参考官方文档

附录:有更新服务器的自动更新方案

带有更新服务器的自动更新方案主要由 electron 自带的 autoUpdater 和 外部更新服务器组成

常用的第三方服务有

  • Hazel - 是一个开源的 update server. 主要利用了 Github 的 release tag 来进行新版本的发布通知。
  • Nuts – 也是一个开源的 update server, 也是利用了 Github 的 release tag 来进行新版本的发布通知。不同的是,它可以将 新版本缓存到本地硬盘,同时还支持 private repo。同时 Heroku 里面提供的 update server 就是 Nuts,在 Heroku 里面可以轻松启动一个 Nuts 服务。
  • electron-release-server – 提供了一个 dashboard 来监控 release
  • Nucleus - 这是一个由 Atlassian 公司维护的 update server, 它可以同时支持多个 app 和 channel。而且因为是通过静态文件服务器实现的,所以大大减少了计算消耗。

大家可以根据自己的需求来选择搭建自己的更新服务器,具体做法可以参考各自的 GitHub 。

而在 app 方面,只需要增加以下代码,就可以实现最基本的更新检测


var app = require('app');
var os = require('os');
var autoUpdater = require('auto-updater');var platform = os.platform() + '_' + os.arch();
var version = app.getVersion();autoUpdater.setFeedURL('http://download.myapp.com/update/'+platform+'/'+version);

笔者博客


https://dhexx.cn/news/show-3478121.html

相关文章

面试清单(Java岗):Java+JVM+数据库+算法+Spring+中间件+设计模式

“金九银十”的秋招热潮已经过去大半了,经过8月9月这两个月的秋招奋战,终于成功拿下了一些大厂的offer。小编经过这么多次的面试,这两天整理了一份面试清单分享给大家,希望能给大家一点帮助(java方向),觉得有帮助的同学…

如何检测 Web 服务请求丢失问题

问题描述 最近偶尔有用户反馈某些 HTTP 接口出现超时问题,而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况。出现这种情况一般是web容器出现问题,客户端连接不上来。本文将主要介绍如何去监控这类问题。 我们是用典型的 Web 服务架构…

读完这份JVM高级笔记,彻底玩转Java虚拟机,面试再也不用“虚”

提到Java虚拟机(JVM),可能大部分人的第一印象是“难”,但当让我们真正走入“JVM世界”的时候,会发现其实问题并不像我们想象中的那么复杂。唯一真正令我们恐惧的,其实是恐惧本身。 JVM 一直都是面试的必考…

友盟+冯成蹊:如何通过数据智能玩转私域流量新生态

简介: 流量三分天下的局面,催生了私域流量的诞生。从第三方数据流量监测角度观察,2020年,以及在未来几年内,在私域流量方面会出现什么样的趋势和新机会?友盟统计分析产品总监冯成蹊,就“如何通过…

技术3面+HR面,快手后台Java开发工程师,已拿意向书

快手面经(技术面3面HR1面) 快手四面,技术3面HR面,本以为一面之后就会凉凉,没想到居然让我二面,挺惊喜的。三面下来我都懵逼了,没想到HR小姐姐有打电话约我面试,突然感觉自己运气爆棚…

云话题 | 第3期 你女朋友在买买买时,程序员小哥在干嘛?

简介: 年货节来了,你女朋友下单了吗?观看直播已经成为人们日常上网的习惯之一,直播购物作为其中的重要项目,销售额屡创新高。最近,天猫年货节刚刚开幕,淘宝直播中就涌入了不少的用户前来抢购&am…

面试清单(Java岗):Java+JVM+数据库+算法+Spring+设计模式

“金九银十”的秋招热潮已经过去大半了,经过8月9月这两个月的秋招奋战,终于成功拿下了一些大厂的offer。小编经过这么多次的面试,这两天整理了一份面试清单分享给大家,希望能给大家一点帮助(java方向),觉得有帮助的同学…

阿里毕玄:提升代码能力的4段经历

简介: 对于程序员而言,我始终认为代码是展现能力的关键。一个优秀程序员写的代码,和一个普通程序员写的代码是很容易看出差别的,代码是展示程序员硬实力的名片。如何提升写代码的能力,始终是一个关键的话题&#xff0c…

一文了解各大数据库查询语言(Gremlin vs Cypher vs nGQL操作篇

文章的开头我们先来看下什么是图数据库,根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。 虽然和关系型数据库存储的结构不同(关系型数据库为表结构,图数据库为…

快速了解云原生架构

简介: 云原生架构本质上也是一种软件架构,最大的特点是在云环境下运行,也算是微服务的一种延伸。 作者 | 潘义文(空易) 来源|阿里巴巴云原生公众号 起源 1. 云原生(Cloud Native)的由来 云原…