Electron-builder打包和自動更新

来源:https://www.cnblogs.com/konghuanxi/archive/2023/08/14/17629100.html
-Advertisement-
Play Games

# Electron-builder打包和自動更新 # 前言 文本主要講述如何為 electron 打包出來軟體配置安裝引導和結合 github 的 release 配置自動更新。 electron-builder 是將 Electron 工程打包成相應平臺的軟體的工具,我的工程是使用 [elect ...


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-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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![file](https://img2023.cnblogs.com/other/3195851/202308/3195851-20230814171638731-1116543252.jpg) 作者 | 郭煒 策劃 | 凌敏 ## 前言 下麵是一段利用 Co-Pilot 輔助開發的小視頻,這是 ...
  • srandmember key [count]count: 為可選的參數 作用: 如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的數組,數組中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。如果 count 為負數,那麼命令返回一個數組,數組 ...
  • 本篇技術博文將深入探討 Redis 持久化機制的原理、配置和使用方式。我們將介紹兩種常用的持久化方式:RDB 持久化和 AOF 持久化。您將瞭解到它們的工作原理、優缺點以及如何根據需求選擇合適的持久化方式。 通過深入學習 Redis 持久化及集群架構,您將能夠構建穩定、可靠並具備高可用性的 Red... ...
  • ## 1、背景 公司內部看到一則問題 > 1、kill -9 mysqld_safe 進程 > 2、systemd 檢測到 mysqld_safe 進程不存在後,重新拉起 mysqld_safe 進程 > 3、mysqld_safe 進程啟動後,發現 mysqld 進程也被重啟 期望:啟、停 mys ...
  • 一、背景 在《SRE: Google運維解密》一書中作者指出,監控系統需要能夠有效的支持白盒監控和黑盒監控。黑盒監控只在某個問題目前正在發生,並且造成了某個現象時才會發出緊急警報。“白盒監控則大量依賴對系統內部信息的檢測,如系統日誌、抓取提供指標信息的 HTTP 節點等。白盒監控系統因此可以檢測到即 ...
  • 本機環境:win10專業版,64位,16G記憶體。 原先用的AS2.2,是很早之前在看《第一行代碼Android(第2版)》的時候,按書里的鏈接下載安裝的,也不用怎麼配置。(PS:第一行代碼這本書對新手確實很適合,第1版是eclise,第2版是Android studio) 最近想給AS升級一下,果不 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 form 表單恢復初始數據 在現代的 Web 開發中,表單是不可或缺的組件之一。用戶可以通過表單輸入和提交數據,而開發者則需要對這些數據進行處理和存儲。然而,在某些情況下,我們可能需要重置表單並恢復到最初的狀態。 本文介紹瞭如何使用 fo ...
  • 在我的項目中,使用i18n切換語言後,會進行`router.push`來刷新頁面。 但我發現寫在store中的選項(我把它們用作下拉框組件的`options`,例如`options="store.statusOption"`),卻並沒有切換語言。它們需要我手動刷新頁面後才能夠切換語言。然而其它組件中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...