Electron客户端的自动升级方案-2022版

基于Electron开发了桌面应用程序,最后免不了要做安装包,还少不了“在线升级”功能。Electron号称支持自动升级,但真到动手做的时候,才发现并没有官方文档上说得那么简单。最近在网上看了不少文章,反复尝试,千头万绪,其中不乏过时信息的干扰,搞得我晕头转向。正当灰头土脸之际,看到这篇文章,思路逐渐清晰。

我也来总结一下吧,先梳理一个脑图:

 再考虑两个关键约束:

  1. GitHub在国内访问很不稳定,会影响升级成功率。因此基于GitHub的发布方式不能用。
  2. electron-forge打出来的安装包,安装时无法修改安装路径。electron-forge的底层是electron-packager,所以electron-packager用起来更复杂,也不在选择之列。剩下就只有electron-builder了。

最后我的选择是脑图中用绿色标出来的路径。实际上,我跑通了两套方案(注:仅在Windows上试验,因为买不起苹果电脑……),不管是electron-forge打出来的包还是electron-builder打出来的包,都能走通自动升级流程。下面就来分别介绍一下,大家各取所需吧。

方案一:electron-forge + electron自带autoUpdater + 自己部署服务器

electron-forge是Electron官方推荐的打包工具,如果不预先了解它的缺陷(比如不能自定义安装路径、安装过程只有一个简陋的GIF动画——这种“免安装过程”的简易安装方式居然被解说成“优势”,见仁见智吧……),很容易被带坑里。但如果你不介意这些缺陷,electron-forge倒也是一种不错的选择,很容易上手。依据官网的“快速入门”搭建Electron演示程序,并且按照文档最后一节“打包并分发您的应用程序”的步骤,为应用项目加入必要的electron-forge配置。

执行npm run make打出安装包,输出在项目文件夹的out子目录。接下来,怎么自己搭建服务器来测试呢?如前文所述,我们不想依赖GitHub来发布。官网推荐了electron-release-server这个开源服务,它还提供了一个后台Web系统来管理版本发布,用起来很方便。

说白了,为了让electron-forge打包的程序能走通自动升级,服务端需要部署两个文件:新版本程序的.nupkg文件和RELEASES文件。这两个文件可以在安装包exe的相同路径下找到。在electron-release-server上部署时,只需要上传.nupkg文件,系统会自动生成匹配的RELEASES文件。然而,实际的测试结果并不愉快😓 系统自动生成的RELEASES文件内容为:

0dbe26b8ef3b8b910a8705bc3e554c3ac3383660 /download/flavor/default/1.5.1/windows_32/autoupdatertester-1.5.1-full.nupkg 343892329

在客户端解析这个文件时抛出了异常:

fatal: Finished with unhandled exception: System.AggregateException: 发生一个或多个错误。 ---> System.Exception: Filename can either be an absolute HTTP[s] URL, *or* a file name在 Squirrel.ReleaseEntry.ParseReleaseEntry(String entry)

对比本地打包时生成的RELEASES文件内容(如下),差异是升级包文件名前有多余的路径:

0DBE26B8EF3B8B910A8705BC3E554C3AC3383660 autoupdatertester-1.5.1-full.nupkg 343892329

尝试过几次修改electron-release-server的服务端配置(据说修改config/local.js 里的appUrl指向一个具体的http地址即可),均未成功!不想浪费太多时间!不就是在服务器上部署两个文件嘛,换成Minio来做吧(灵感来自于这篇文章)。

Minio是实现了S3协议(S3:Simple Storage Service,简单存储服务)的简易服务器,用起来非常方便!搭建步骤如下:

  1. 从https://min.io/download下载Server程序(minio.exe)和Client程序(mc.exe),并且存放在本地硬盘上,如D:\minio-home
  2. 在minio-home文件夹下创建minio-data子文件夹,再在minio-data下创建test-bucket1子文件夹
  3. 在控制台执行如下命令即可将服务运行起来,还可以看到一些关键信息输出:
    minio server ./minio-data

4. 在浏览器里打开http://127.0.0.1:9000,用户名密码都输入为minioadmin,登录成功后,点击“test-bucket1”右侧的Manage按钮,然后将Access Policy从Private改成Public

5. 可以在D:\minio-home\minio-data\test-bucket1下放一个index.html,然后尝试在浏览器里访问http://127.0.0.1:9000/test-bucket1/index.html,如果打开成功,恭喜你,Minio服务搭建成功了!

终于来到了激动人心的时刻!我们开始测试自动升级:

  1. 确保main.js中autoUpdater指向上文搭建的服务器地址:autoUpdater.setFeedURL('http://127.0.0.1:9000/test-bucket1') 注:后续在线上部署正式环境之后,这里也要记得改一下。
  2. package.json中“version”设置为初始版本,假定为1.5.0
  3. 执行npm run make进行打包
  4. 运行out\make\squirrel.windows\x64\xxx-1.5.0 Setup.exe,将程序安装到本地硬盘
  5. 将package.json中“version”改为高版本,比如1.5.1
  6. 再次执行npm run make进行打包
  7. 将out\make\squirrel.windows\x64\下的xxx-1.5.1-full.nupkg和RELEASES两个文件拷贝到D:\minio-home\minio-data\test-bucket1目录下
  8. 运行低版本v1.5.0演示程序,过几秒钟,如果看到下面这个弹窗,恭喜你,测试成功啦!(如果不成功,需要把package.json的”version”改回1.5.0,调整代码后重新打包、安装后再测试……)

GitHub完整演示代码:
https://github.com/luqiming666/AutoUpdater-forge

补充几点说明:

  1. 客户端使用Electron自带的autoUpdater来处理自动升级,即const { autoUpdater } = require('electron')
  2. 自动升级功能不可以在VS Code中调试,因为这个功能依赖的升级组件只有在打包后才会带上,于是只能通过electron-log写日志的方式来排查问题。日志文件位于:%AppData%\{app name}\logs\main.log。在演示程序的安装目录下也有几个Squirrel相关的日志文件,可以查看到更多细节。
  3. electron-is-dev组件可以很方便地检测当前程序执行在调试模式还是正式运行模式。
  4. 需要安装electron-squirrel-startup组件,并且在main.js代码的顶部放置下面这行代码,以创建桌面快捷方式:
    if (require('electron-squirrel-startup')) return;

方案二:electron-builder + electron-updater的autoUpdater + 自己部署服务器

electron-builder是另一种非常强大的打包工具,它支持Windows、macOS和Linux,以及很多种打包格式,在Windows上支持NSIS安装包——允许各种定制。总之,它的官方文档值得仔细一读。

我们还是可以依据Electron官网的“快速入门”来搭建演示程序,只是不再执行electron-forge的打包步骤。接下来,我们侧重介绍“自动升级”相关的package.json配置。package.json中的"build": {}节点是专门为electron-builder服务的,在这里可以为各个平台配置目标的打包格式,比如我们希望Windows上是nsis,Mac上是dmg,等等。另外可以用一个“nsis”节点定制安装包的各种行为(更多配置选项参见官方文档):

"nsis": {"oneClick": false,"perMachine": true,"allowElevation": true,"allowToChangeInstallationDirectory": true,"uninstallDisplayName": "${productName}","deleteAppDataOnUninstall": true}

另外一个非常重要的节点是"publish"。有了这个节点,打包时才会生成自动升级必要的latest.yml文件:

"publish": [{"provider": "generic","url": "http://localhost:9000/test-bucket2"}],

注:正式部署时,上述url需要修改为线上环境的地址。

说白了,为了让electron-builder打包的程序能走通自动升级,服务端需要部署两个文件:新版本安装包.exe文件和latest.yml文件。(如果要支持增量升级,还需要同时部署.blockmap文件。老版本的.blockmap文件也要部署在线。)这些文件可以在打包输出目录、安装包exe的相同路径下找到。

演示程序准备好了,就可以开始测试了。还是使用“方案一”中搭建的Minio服务。这次在minio-data下创建一个新的子文件夹test-bucket2,并且将它的Access Policy改成Public。然后,执行如下步骤:

  1. package.json中“version”设置为初始版本,假定为1.0.0
  2. 执行npm run dist进行打包
  3. 运行out\xxx Setup 1.0.0.exe,将程序安装到本地硬盘
  4. 将package.json中“version”改为高版本,比如1.0.1
  5. 再次执行npm run dist进行打包
  6. 将out\xxx Setup 1.0.1.exe和latest.yml两个文件拷贝到D:\minio-home\minio-data\test-bucket2目录下
  7. 运行低版本v1.0.0演示程序,过几秒钟,不出意外的话就可以看到检测到新版本的弹窗啦!

GitHub完整演示代码:
https://github.com/luqiming666/AutoUpdater-nsis

补充几点说明:

  1. 客户端使用electron-updater 的autoUpdater来处理自动升级(而非Electron自带的autoUpdater),const { autoUpdater } = require("electron-updater")
  2. 不需要调用autoUpdater.setFeedURL(),因为服务器地址已经在package.json的“publish”节点中指定了,在打包时会写入resources目录下的app-update.yml中,程序运行时会从这里读取配置。如果服务器URL有变更,修改package.json中的配置后重新打包即可。
  3. 如果想使用灰度发布(staged rollouts),可以在latest.yml里插入stagingPercentage字段,取值范围为0~100
  4. 在打包过程中没有找到可以插入releaseNotes的地方。可以在部署前修改latest.yml,手动插入这个字段:

两个方案介绍完了。最后再总结一下:

  1. 打包工具的选择。因为electron-forge打出来的包不能修改安装路径,所以选择electron-builder打出NSIS安装包,这也为安装程序的进一步定制留出足够空间。
  2. 在公有云上自建服务器,无须搭建第三方服务。对于NSIS形式的安装程序,只需要在公网URL可访问的服务器目录下放置两个文件:新版本安装包exe和与安装包同步打包出来的lastest.yml。

希望大家读了我这篇文章(以及文中链接的少量扩展阅读),就能把Electron客户端软件的自动升级跑通。不必经历我之前艰难的探索之路。如果还有问题,欢迎私信我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25094.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ControlNet 和 T2I-Adapter,控制Stable Diffusion的不受控制的力量,AI 图像生成精确控制的破冰解决方案(教程含免安装使用方式)

控制Stable Diffusion的不受控制的力量 人工智能艺术社区的兴奋在最近几天达到顶峰,让我想起了去年 Stable Diffusion 的首次发布。本次重点介绍基于Stable Diffusion 1.5的轻量级预训练模型ControlNet,可以检测输入图像中的边缘、深度图或姿态骨架,结合文字提示,精准指导…

chatgpt赋能python:Python免安装怎么用?

Python免安装怎么用? 什么是Python? Python是一种高级、解释型、交互式、面向对象的编程语言。它被广泛应用于Web开发、数据科学、人工智能、网络爬虫、游戏开发等领域。Python拥有简洁明了的语法,使得它易于上手,同时也具有强大…

如何用TL084制作低音炮电路

本低音电路具有适应面广、可调性强、选择性好、失真度低的特点,并可进行特性设置,与合适的扬声器 系统配有源箱,适用于重低音重放。 图1所示的是低音处理电路。4个运算放大器IClB、IClA、IClC和IClD分别承担输入放大、窄频带滤波调节、宽…

干货·Doherty功放设计

当今世界,通信技术的发展可谓日新月异(准确来说是人类的欲望日新月异...),然而当前人类所依赖的无线通信完全借由无线电,频段还大都集中在C频段以下,相当拥挤。那么,为了在有限的频谱资源内增加…

IU8689+IU5706 单声道100W/立体声60W同步升压+功放IC大功率拉杆音箱应用组合方案

引言 目前中大功率拉杆音箱主要采用12V铅酸电池为供电电源,在电源直供的时候,一般的功放芯片输出功率在20W左右(喇叭为4欧、THD10%)。超过50W的功率现阶段市场上主要采用升压芯片TPA3116的组合解决方案。 随着竞争的加剧&#x…

华为Push用户增长服务:精准触达,加速增长

速戳了解华为Push用户增长服务:通过精细化运营,助力开发者高效实现用户增长,提升用户活跃度和粘性! 合作咨询请点此链接 了解更多详情>> 访问华为开发者联盟官网 获取开发指导文档 华为移动服务开源仓库地址:G…

华为Vo5G技术EPSFB

EPS FB EPS FB即 EPS Fallback,5G NR 初期不提供语音业务,当 gNB 在 NR 上建立 IMS话音 通道时触发切换,此时 gNB 向 5GC 发起重定向或者 inter-RAT切换请求,回落到 LTE 网络,由 VoLTE提供服务,如下&#…

OpenAI最新官方ChatGPT聊天插件接口《插件示例demo》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(四)(附源码)

Example plugins 插件示例demo 前言Introduction 导言Learn how to build a simple todo list plugin with no auth 了解如何构建一个简单的待办事项列表插件,无需授权Learn how to build a simple todo list plugin with service level auth 了解如何构建一个简单的…

一个简单的星座运势查询APP

先看效果图如下: 这是一个简单的星座运势查看的APP。 先来看欢迎界面,欢迎界面很简单,只要是一个简单的动画播放效果,然后对动画播放设置监听,当动画播放结束后自动跳转到主界面。欢迎界面主要代码如下: p…

运气指数测试软件,测一测最近的运势如何,有什么测试运势的软件

说到测一测最近的运势如何,大家都了解,有人问求测算运程,最近不太顺利,另外,还有人想问最近运势不太好,帮帮测里的大师能化解吗,这是怎么回事?其实有好家伙测试运势的软件吗&#xf…

chatgpt赋能python:Python排队:提高效率、优化流程的神器

Python排队:提高效率、优化流程的神器 随着科技的不断进步,排队已经成为了现代生活中不可避免的一部分。在各个行业中,排队都是必须考虑的问题,包括餐馆、医院、机场和银行等等。针对排队问题,我们可以使用Python编程…

与Bard竞争,OpenAI急了 官宣:ChatGPT用户无需排队,直接可用上联网和插件功能...

OpenAI和谷歌,已经打得急红了眼,ChatGPT Plus用户,下周就可以体验联网和插件功能,无需再排队。鲨疯了,真的鲨疯了!来自:新智元排版:深度学习自然语言处理 进NLP群—>加入NLP交流群…

2021ICPC澳门站部分题解

链接 A 构造一个生成函数就完了,正好有一个板子,贴一下完事。社会主义重拳出击,没想到区域赛会出这种题。澳门的前六个题是签到、模拟、最小异或生成树、分治ntt、构造、dag上sg函数。跪了。和大陆的区域赛真不一样,大陆属实小清…

澳门科技大学计算机研究生就业,澳门科技大学硕士申请难度(2021年)

原标题:澳门科技大学硕士申请难度(2021年) 澳门科技大学成立于2000年,隶属于澳门科技大学基金会,是澳门回归中国后成立的第一所私立大学,也是目前澳门特别行政区规模最大的大学。2009年美国《时代周刊》评选大中华区100名校&#…

澳门大学计算机qs排名,澳门大学世界QS排名

澳门大学世界QS排名 发表时间:2019-09-27 作者:211大学网 澳门大学(Universidade de Macau / University of Macau),简称澳大,是澳门一所现代大学,是澳门一所获AACSB认证的大学。 澳门大学前身为1981年3月28日成立的东…

大模型开发(四):OpenAI API调用方法

全文共8500余字,预计阅读时间约17~30分钟 | 满满干货(附代码示例),建议收藏! 代码下载点这里 一、获取OpenAI的API keys 前提:拥有OpenAI账户,并可以魔法上网 如果涉及账户或魔法上网问题,请看本文末尾的…

ChatGPT技术将给智能硬件带来更多新机会

近期,由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT在各大中外媒体平台掀起了一阵狂热之风。短短2个月时间,其用户量就达到一亿用户,注册用户之多导致服务器一度瘫痪。 ChatGPT到底是什么呢?ChatGPT是一种基于GPT-3&…

使用ChatGPT完成程序开发——目标:不写一行代码完成图像识别并点击

本文作为一个使用AI开发的思路,让更多的人可以利用AI完成一些简单的程序,文中使用的是国内镜像GTP3.5 源码: GitHub - kasimshi/testCV: AI编写的OpenCV图像识别例子 GTP镜像: 知汇 对AI描述我们要做的功能,让它给给初步的思路和方向 作为新…

如何在WhatsApp中更改聊天背景

By default, WhatsApp has a pretty weird and childish background for your chat messages. The good news is that you can change it. Here’s how. 默认情况下,WhatsApp的聊天消息背景非常古怪而幼稚。 好消息是您可以更改它。 这是如何做。 We’re using an …

如何抠图换背景?介绍两个抠图换背景的方法

如何抠图换背景?在我们的日常生活中,总是会需要使用到抠图技巧,现在已经进入冬天,有一些特殊情况以及天气寒冷,我们可能很少出门拍照。这个时候如果我们想要在朋友圈发一些新图的话,其实完全可以借助于抠图…