Electron-builder打包和自动更新

前言

文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新。

electron-builder 是将 Electron 工程打包成相应平台的软件的工具,我的工程是使用 electron-vite 构建的,其默认集成了 electron-builder ,下文也是基于 electron-vite 生成的工程进行讲解。

下文是基于 Window 平台讲解,所以安装包我也会说成 exe 文件

配置

electron-builder 有两种配置方式

  • 在 package.json 配置
  • 使用 electron-builder.yml 配置

如果打包命令带上 —config,就是使用 electron-builder.yml 的方式,例如

electron-builder --win --config

以下介绍都基于 electron-builder.yml 的方式,如需使用 package.json,请自行翻阅文档转换

详见:CLI

NSIS安装引导

electron-builder 生成的安装包默认是一键安装,也就是无法选择安装路径等。这时候就需要用到 NSIS 了(注意:NSIS 只适用于 Window 平台)

只需要修改 electron-builder.yml 即可,我常用的配置如下:

nsis:
oneClick: false # 创建一键安装程序还是辅助安装程序(默认是一键安装)
allowElevation: true # 是否允许请求提升,如果为false,则用户必须使用提升的权限重新启动安装程序 (仅作用于辅助安装程序)
allowToChangeInstallationDirectory: true # 是否允许修改安装目录 (仅作用于辅助安装程序)
createStartMenuShortcut: true # 是否创建开始菜单快捷方式
artifactName: ${productName}-${version}-${platform}-${arch}.${ext}
shortcutName: ${productName}
uninstallDisplayName: ${productName}
createDesktopShortcut: always

详见:NsisOptions

自动更新

结合 github 的 release 配置自动更新

代码修改

  1. 修改 electron-builder.yml

    以 dubbo 仓库举例子:https://github.com/apache/dubbo

    # 仓库配置
    publish:
    provider: github # 选择github平台
    owner: apache # github用户名
    repo: dubbo # github仓库名
    # 更新日志
    releaseInfo:
    releaseNotes: |
    这是更新日志
    测试测试
  2. 工程代码修改

    我是基于 TypeScript 的写法,如果需要 JavaScript 的写法,请参考文档:Auto-Update官方案例

    • 安装 electron-updater

      npm install electron-updater
    • 主线程添加自动更新代码

      import { autoUpdater, UpdateInfo } from 'electron-updater';
      
      // dev-start, 这里是为了在本地做应用升级测试使用,正式环境请务必删除
      if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
      autoUpdater.updateConfigPath = path.join(__dirname, '../../dev-app-update.yml');
      }
      Object.defineProperty(app, 'isPackaged', {
      get() {
      return true;
      }
      });
      // dev-end // 触发检查更新(此方法用于被渲染线程调用,例如页面点击检查更新按钮来调用此方法)
      ipcMain.on('check-for-update', () => {
      logger.info('触发检查更新');
      autoUpdater.checkForUpdates();
      }); // 设置自动下载为false(默认为true,检测到有更新就自动下载)
      autoUpdater.autoDownload = false;
      // 检测下载错误
      autoUpdater.on('error', (error) => {
      logger.error('更新异常', error);
      }); // 检测是否需要更新
      autoUpdater.on('checking-for-update', () => {
      logger.info('正在检查更新……');
      });
      // 检测到可以更新时
      autoUpdater.on('update-available', (releaseInfo: UpdateInfo) => {
      logger.info('检测到新版本,确认是否下载');
      const releaseNotes = releaseInfo.releaseNotes;
      let releaseContent = '';
      if (releaseNotes) {
      if (typeof releaseNotes === 'string') {
      releaseContent = <string>releaseNotes;
      } else if (releaseNotes instanceof Array) {
      releaseNotes.forEach((releaseNote) => {
      releaseContent += `${releaseNote}\n`;
      });
      }
      } else {
      releaseContent = '暂无更新说明';
      }
      // 弹框确认是否下载更新(releaseContent是更新日志)
      dialog
      .showMessageBox({
      type: 'info',
      title: '应用有新的更新',
      detail: releaseContent,
      message: '发现新版本,是否现在更新?',
      buttons: ['否', '是']
      })
      .then(({ response }) => {
      if (response === 1) {
      // 下载更新
      autoUpdater.downloadUpdate();
      }
      });
      });
      // 检测到不需要更新时
      autoUpdater.on('update-not-available', () => {
      logger.info('现在使用的就是最新版本,不用更新');
      });
      // 更新下载进度
      autoUpdater.on('download-progress', (progress) => {
      logger.info('下载进度', progress);
      });
      // 当需要更新的内容下载完成后
      autoUpdater.on('update-downloaded', () => {
      logger.info('下载完成,准备更新');
      dialog
      .showMessageBox({
      title: '安装更新',
      message: '更新下载完毕,应用将重启并进行安装'
      })
      .then(() => {
      // 退出并安装应用
      setImmediate(() => autoUpdater.quitAndInstall());
      });
      });

      上面的代码只是主线程的,还需要渲染线程和页面配置

发布 release

  1. 创建 token

    登录 github → 点击个人头像 → Settings → 选择Developer Settings → 创建token

    配置选择

    复制创建好的 token

  2. 给仓库设置 token

    回到 electron 工程项目 → Settings → Secrets and variables → Actions

    secret 的名字使用 GH_TOKEN,值就是刚才复制的 token

  3. 添加 github action 需要的文件

    在 .github/workflows 文件夹下创建 build.yml 文件,内容如下(请自行把注释删掉)

    我们这里就用到了上一步配置的 GH_TOKEN

    name: build
    
    # 当提交tag时触发
    on:
    push:
    tags:
    - "*" jobs:
    build: runs-on: windows-latest steps:
    # 步骤1,检出仓库代码
    - name: Check out Git repository
    uses: actions/checkout@v3
    # 步骤2,使用node环境
    - name: Use Node.js
    uses: actions/setup-node@v3
    with:
    node-version: 18.x
    cache: 'npm'
    # 步骤3,执行npm install命令,安装依赖
    - name: Install dependencies
    run: npm install
    # 步骤4,执行打包命令(请自行修改成自己的打包命令)
    - name: build win
    run: npm run build:win
    env:
    GH_TOKEN: ${{ secrets.GH_TOKEN }}
    # 步骤5,发布release,需要注意包含的3个文件
    - name: release
    uses: softprops/action-gh-release@v1
    with:
    files: |
    dist/*.exe
    dist/*.exe.blockmap
    dist/latest.yml
    draft: false
    env:
    GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}

    看清楚注释,作业别闭眼抄哈

  4. 发布

    提交代码,推送tag,等待几分钟,release 就构建好了

总结

没啥好总结的


参考资料

electron-builder

GitHub Actions

Electron-builder打包和自动更新的更多相关文章

  1. 在windows平台下electron-builder实现前端程序的打包与自动更新

    由于8月份上旬公司开发一款桌面应用程序,在前端开发程序打包更新时遇到一些困扰多日的问题,采用electron-builder最终还是得到解决~ 以下是踩坑的过程及对electron打包与更新思路的梳理 ...

  2. Winform 打包 混淆 自动更新

    路径: 最终的解决方案是,ConfuserEx+Installshield+AutoUpdater.NET,ConfuserEx做代码混淆工作,Installshield可以解决注册表的问题,Auto ...

  3. electron builder 打包错误 cannot unpack electron zip file 解决方案

    npm run buildwin > study01@1.0.0 buildwin F:\Nodejs\electron\Test\study01> electron-builder -- ...

  4. electron builder 打包多个第三方依赖的软件

    背景 在实际的开发过程中,我们最后打包生成的exe.会依赖一些第三方的软件,或者说是一些系统的环境,比如 .net framework vc++ 等,这些环境不能依赖客户的环境,所以最好的做法是在打包 ...

  5. electron开发 - mac平台的打包和签名 - 针对electron-builder的自动更新

    配合自动更新 - 安装包签名(mac)(待补充) 前提:实现自动更新需要签名 一.本地开发调试mac签名(无需具有权限的appple账号) 打开xcode,xcode -> preference ...

  6. Electron应用使用electron-builder配合electron-updater实现自动更新(windows + mac)

    发客户端一定要做的就是自动更新模块,否则每次版本升级都是一个头疼的事.下面是Electron应用使用electron-builder配合electron-updater实现自动更新的解决方案. 1.安 ...

  7. 【原创】从零开始搭建Electron+Vue+Webpack项目框架(五)预加载和Electron自动更新

    导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(四)Electron配置润色(五)预加载及自动更 ...

  8. 分析nuget源码,用nuget + nuget.server实现winform程序的自动更新

    源起 (个人理解)包管理最开始应该是从java平台下的maven开始吧,因为java的开发大多数是基于开源组件开发的,一个开源包在使用时很可能要去依赖其他的开源包,而且必须是特定的版本才可以.以往在找 ...

  9. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  10. 【原创】我所理解的自动更新-外网web服务器配置

    ClientDownload和ClientUpdate共享渠道配置信息: channel-0.php //以appstore的渠道为例 <?php define('APPNAME', 'TOKE ...

随机推荐

  1. 2022-01-04:一个无序数组长度为n,所有数字都不一样,并且值都在[0...n-1]范围上。 返回让这个无序数组变成有序数组的最小交换次数。 来自小红书。

    2022-01-04:一个无序数组长度为n,所有数字都不一样,并且值都在[0-n-1]范围上. 返回让这个无序数组变成有序数组的最小交换次数. 来自小红书. 答案2022-01-04: 下标循环怼. ...

  2. 2021-09-01:三数之和。给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

    2021-09-01:三数之和.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. ...

  3. WPF入门教程系列二十四——DataGrid使用示例(1)

    WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系列五--Window 介 ...

  4. Python分割多空格字符方法

    问题: 现有一个字符串 "1 + 5" ,想要获取 1,+,5 这三个元素 做法: str.split(' ') ['1', '', '', '', '', '', '+', '' ...

  5. ODOO13之六:Odoo 13开发之模型 – 结构化应用数据

    在本系列文章第三篇Odoo 13 开发之创建第一个 Odoo 应用中,我们概览了创建 Odoo 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...

  6. 如何科学地利用MTTR优化软件交付流程?

    谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振.在本文中,你将了解到 MTTR 的作用.为什么它对行业研究很有用.你可能被它误导的原因以及如何避免 MTTR ...

  7. docker desktop 与 wmware tv-x

    开启WSL2,获得docker desktop的最佳性能 windows默认拥有WSL1 PS C:\Users\supermao> wsl --list --verbose NAME STAT ...

  8. STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5 外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能. 首先需要打开STM32CubeMX工具.输入开 ...

  9. midjourney国内版上线! 快来体验一下midjourney的强大功能

    最近大火的midjourney国内版上线了!该网站对接了midjourneyAPI,以文生图.以图生图功能都支持,下面我们来体验一下它的功能. 网址:https://www.weijiwangluo. ...

  10. 01-C语言基础语法

    目录 一. C语言发展史 二. 数据类型 三. 常量和变量 四. 字符串和转义字符 五. 选择语句 六. 循环语句 七. 函数 一. C语言发展史 1963 年ALGOL 60 作为C语言最早的模型, ...