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

    Untitled

    配置選擇

    Untitled

    復制創建好的 token

  2. 給倉庫設置 token

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

    secret 的名字使用 GH_TOKEN,值就是剛才復制的 token

    Untitled

  3. 添加 github action 需要的文件

    在 .github/workflows 文件夾下創建 build.yml 文件,內容如下(請自行把注釋刪掉)

    我們這里就用到了上一步配置的 GH_TOKEN

    name: build# 當提交tag時觸發
    on:push:tags:- "*"jobs:build:runs-on: windows-lateststeps:# 步驟1,檢出倉庫代碼- name: Check out Git repositoryuses: actions/checkout@v3# 步驟2,使用node環境- name: Use Node.jsuses: actions/setup-node@v3with:node-version: 18.xcache: 'npm'# 步驟3,執行npm install命令,安裝依賴- name: Install dependenciesrun: npm install# 步驟4,執行打包命令(請自行修改成自己的打包命令)- name: build winrun: npm run build:winenv:GH_TOKEN: ${{ secrets.GH_TOKEN }}# 步驟5,發布release,需要注意包含的3個文件- name: releaseuses: softprops/action-gh-release@v1with:files: |dist/*.exedist/*.exe.blockmapdist/latest.ymldraft: falseenv:GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
    

    看清楚注釋,作業別閉眼抄哈

  4. 發布

    提交代碼,推送tag,等待幾分鐘,release 就構建好了

總結

沒啥好總結的


參考資料

electron-builder

GitHub Actions

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中大型無人機遠程VHF語音電臺系統方案

方案背景 中大型無人機在執行飛行任務時&#xff0c;特別是在管制空域飛行時地面航管人員需要通過語音與無人機通信。按《無人駕駛航空器飛行管理暫行條例》規定&#xff0c;中大型無人機應當進行適航管理。物流無人機和載人eVTOL都將進行適航管理&#xff0c;所以無人機也要有…

Unity 工具 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據的簡單整理

Unity 工具 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據的簡單整理 目錄 Unity 工具 之 Azure 微軟SSML語音合成TTS流式獲取音頻數據的簡單整理 一、簡單介紹 二、實現原理 三、實現步驟 四、關鍵代碼 一、簡單介紹 Unity 工具類&#xff0c;自己整理的一些游戲開發可…

Qt creator之對齊參考線——新增可視化縮進功能

Qt creator隨著官方越來越重視&#xff0c;更新頻率也在不斷加快&#xff0c;今天無意中發現qt creator新版有了對齊參考線&#xff0c;也稱可視化縮進Visualize Indent&#xff0c;默認為啟用狀態。 下圖為舊版Qt Creator顯示設置欄&#xff1a; 下圖為新版本Qt Creator顯示設…

Day14 01-Shell腳本編程詳解

文章目錄 第一章 Shell編程【重點】1.1. Shell的概念介紹1.1.1. 命令解釋器4.1.1.2. Shell腳本 1.2. Shell編程規范1.2.1. 腳本文件的結構1.2.2. 腳本文件的執行 1.3. Shell的變量1.3.1. 變量的用法1.3.2. 變量的分類1.3.3. 局部變量1.3.4. 環境變量1.3.5. 位置參數變量1.3.6. …

Python入門【內存管理機制、Python緩存機制、垃圾回收機制、分代回收機制】(三十二)

&#x1f44f;作者簡介&#xff1a;大家好&#xff0c;我是愛敲代碼的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列專欄&#xff1a;python入門到實戰、Python爬蟲開發、Python辦公自動化、Python數據分析、Python前后端開發 &#x1f4e7;如果文章知識點有錯誤…

LeetCode150道面試經典題-- 存在重復元素 II(簡單)

1.題目 給你一個整數數組 nums 和一個整數 k &#xff0c;判斷數組中是否存在兩個 不同的索引 i 和 j &#xff0c;滿足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 2.示例 示例 1&#xff1a; 輸…

CSS中的字體屬性有哪些值,并分別描述它們的作用。

聚沙成塔每天進步一點點 ? 專欄簡介? font-style? font-weight? font-size? font-family? font-variant? line-height? letter-spacing? word-spacing? font? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專…

JS中對象數組深拷貝方法

structuredClone() JavaScript 中提供了一個原生 API 來執行對象的深拷貝&#xff1a;structuredClone。它可以通過結構化克隆算法創建一個給定值的深拷貝&#xff0c;并且還可以傳輸原始值的可轉移對象。 當對象中存在循環引用時&#xff0c;仍然可以通過 structuredClone()…

過濾字符,繞過

構造不包含字母和數字的webshell <?phpecho "A"^""; ?>運行結果為! 代碼中對字符"A"和字符”"進行了異或操作。在PHP中&#xff0c;兩個變量進行異或時&#xff0c;先會將字符串轉換成ASCII值&#xff0c;再將ASCII值轉換成二進制…

容器docker安裝及應用

目錄 二進制安裝docker應用啟動docker拉取鏡像查看當前主機鏡像查看鏡像詳細信息運行容器 二進制安裝docker 環境 centos 7 [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# wget -P /data/ https://download.docker.com/linux/static/stable/x86_64/docker-18.03.1-ce.t…

【聲波】聲波在硼酸、硫酸鎂 (MgSO4) 和純水中的吸收研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

MAC 命令行啟動tomcat的詳細介紹

MAC 命令行啟動tomcat MAC 命令行啟動tomcat的詳細介紹 一、修改授權 進入tomcat的bin目錄,修改授權 1 2 3 ? bin pwd /Users/yp/Documents/workspace/apache-tomcat-7.0.68/bin ? bin sudo chmod 755 *.sh sudo為系統超級管理員權限.chmod 改變一個或多個文件的存取模…

2.js中attr()用來修改或者添加屬性或者屬性值

attr()可以用來修改或者添加屬性或者屬性值 例&#xff1a;<input type"button" class"btn btn-info" id"subbtn" style"font-size:12px" value"我也說一句"/>1.如果想獲取input中value的值 $(#subbtn).attr(value);…

ASP.NET Core中路由規則匹配

RESTful約束&#xff0c;如果在一個控制器里面有多個Get、Post...的操作 1、在一個控制器里面可以定義多個API方法 2、通過路由規則來區分 /// <summary> /// 獲取用戶信息 /// </summary> /// <param name"user"></param> /// <returns…

c++ | 字節轉換 | 字長 | 機器位數

為什么有的時候腦子轉不過來&#xff1f;&#xff1f; 為什么要對字節、機器長啊、位啊都要門清 位數 一般的就是指計算機的位數&#xff0c;比如64位/32位&#xff0c;更簡單的理解&#xff0c;計算機就是在不停的做二進制的計算&#xff0c;比如32位計算機&#xff0c;在長…

[保研/考研機試] KY26 10進制 VS 2進制 清華大學復試上機題 C++實現

題目鏈接&#xff1a; 10進制 VS 2進制http://www.nowcoder.com/share/jump/437195121691738172415 描述 對于一個十進制數A&#xff0c;將A轉換為二進制數&#xff0c;然后按位逆序排列&#xff0c;再轉換為十進制數B&#xff0c;我們稱B為A的二進制逆序數。 例如對于十進制…

算法基礎課——基礎算法(模板整理)

快速排序 快速排序 #include <iostream> #include <algorithm> using namespace std; int n; int s[100000]; int main() {cin>>n;for(int i0;i<n;i){cin>>s[i];}sort(s,sn);for(int i0;i<n;i){cout<<s[i]<<" ";}cout<…

4.物聯網LWIP之C/S編程

LWIP配置 服務器端實現 客戶端實現 錯誤分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 為什么要修改定時源為Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL庫與FREERTOS都需要使用systi…

leetcode做題筆記89. 格雷編碼

n 位格雷碼序列 是一個由 2n 個整數組成的序列&#xff0c;其中&#xff1a; 每個整數都在范圍 [0, 2n - 1] 內&#xff08;含 0 和 2n - 1&#xff09;第一個整數是 0一個整數在序列中出現 不超過一次每對 相鄰 整數的二進制表示 恰好一位不同 &#xff0c;且第一個 和 最后一…

C語言好題解析(三)

目錄 選擇題一選擇題二選擇題三選擇題四編程題一編程題二 選擇題一 以下程序段的輸出結果是&#xff08;&#xff09;#include<stdio.h> int main() { char s[] "\\123456\123456\t"; printf("%d\n", strlen(s)); return 0; }A: 12 B: 13 …