• Electron~增量更新


    增量更新说明文档

    English Version

    提前准备

    1. 准备本地或者远程服务器或者远程静态文件url
    npm i -g http-server
    cd yourFileFolder // 进入任意文件夹
    http-server -p 4000 // 快速开启本地服务,用于存储更新文件
    
    1. 配置和打包,拿到更新文件内容并压缩
    // package.json
    // 关闭asar模式
      "asar": false,
    // 打包
      npm run pack-windows
    // 进入打好的windows包
      cd release.x.x_setupwin-unpacked
    esources
    // 压缩app文件夹 => app.zip, 拷贝app-update.yml和app.zip
    
    
    1. app.zip app-update.yml 传到服务器

    2. 本地流程,启动客户端,点击增量更新

    // 入口
    // src
    endercomponentsAutoUpdateindex.tsx
     <Button type='primary' onClick={() => checkForPartUpdates()} style={{ marginLeft: 10 }}>
                增量更新
            </Button>
    
    
    // 本地检查与服务器的version版本比较
    // 如果找到新版本,则向主进程通信,通知checkForPartUpdates开始更新
    
    // src
    enderutilsautoUpdatepartUpdate.js
    /** 检查更新 */
    export async function checkForPartUpdates() {
      try {
        // check version 检查版本
        const res = await checkVersion()
        if (res && res === 'OPEN_PART_UPDATE') {
          // 增量更新
          console.log('OPEN_PART_UPDATE')
          confirm({
            title: '检测到更新',
            icon: <ExclamationCircleOutlined />,
            content: (
              <div>
                <p>是否更新?</p>
              </div>
            ),
            okText: '确认',
            cancelText: '取消',
            onOk() {
              ipc && ipc.send('checkForPartUpdates')
              message.info('请耐心等待几秒..')
            },
            onCancel() {
              console.log('Cancel');
            },
          });
          // partUpdates()
        }
        if (res && res === 'OPEN_ALL_UPDATE') {
          console.log('OPEN_ALL_UPDATE')
          // 全量更新
        }
      } catch (error) {
        console.error('checkVersionERROR', error)
      }
    }
    
    function checkVersion(params) {
      return new Promise((resolve, reject) => {
        const currentVersion = remote.app.getVersion()
        // 获取最新版本号
        downloadFile(remoteYmlURL, localYmlUrl).then(res => {
          const remoteVersion = JSON.stringify(res.data).split('\n')[0].split(' ')[1]
          const remoteVersionArr = remoteVersion.split('.')
          const currentVersionArr = currentVersion.split('.')
          // 0.1.1 Y和Z比较来开启增量更新  1.1.1 X比较来开启全量更新
          if (Number(remoteVersionArr[0]) > Number(currentVersionArr[0])) {
            // 开启全量更新
            return resolve('OPEN_ALL_UPDATE')
          } else if (Number(remoteVersionArr[2]) > Number(currentVersionArr[2]) || Number(remoteVersionArr[1]) > Number(currentVersionArr[1])) {
            // 开启增量更新
            return resolve('OPEN_PART_UPDATE')
          } else {
            console.log('无版本变动,不更新')
          }
        }).catch(e => {
          console.error(e)
        })
      })
    }
    
    
    // srcmaincontrolsAppAutoUpdater.js
    // 下载服务器文件包
    // 本地解压和备份,替换,重启客户端即可完成更新
    
      // 增量更新
      ipcMain.on('checkForPartUpdates', async (e, msg) => {
        console.log('checkForPartUpdates', msg)
        // if (isElectronDev) {
        //   console.log('开发模式不支持')
        //   return
        // }
        try {
          if (fs.existsSync(`${localresourcePath}.back`)) { // 删除旧备份
            deleteDirSync(`${localresourcePath}.back`)
          }
          if (fs.existsSync(localresourcePath)) {
            fs.renameSync(localresourcePath, `${localresourcePath}.back`); // 备份目录
          }
          await downloadFile(remoteAppURL, appZipPath)
          console.log('app.asar.unpacked.zip 下载完成')
          fs.mkdirSync(localresourcePath) // 创建app来解压用
          try {
            // 同步解压缩
            const unzip = new AdmZip(appZipPath)
            unzip.extractAllTo(resourcePath, true)
            console.log('app.asar.unpacked.zip 解压缩完成')
            console.log('更新完成,正在重启...')
            mainWindow.webContents.send('partUpdateReady')
            setTimeout(() => {
              app.relaunch(); // 重启
              app.exit(0);
            }, 1800);
          } catch (error) {
            console.error(`extractAllToERROR: ${error}`);
          }
          // 更新窗口
          // BrowserWindow.getAllWindows().forEach((win: any) => {
          //   win.webContents.reload()
          //   // remote.app.relaunch(); // 重启
          //   // remote.app.exit(0);
          // })
          console.log('webContents reload完成')
        } catch (error) {
          console.error(`checkForPartUpdatesERROR`, error)
          if (fs.existsSync(`${localresourcePath}.back`)) {
            fs.renameSync(`${localresourcePath}.back`, localresourcePath);
          }
        }
      })
    
    

    github

  • 相关阅读:
    POJ 3436 ACM Computer Factory (网络流,最大流)
    POJ 1847 Tram (最短路径)
    POJ 1062 昂贵的聘礼(图论,最短路径)
    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)
    POJ 3159 Candies (图论,差分约束系统,最短路)
    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)
    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
    POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)
    POJ 1502 MPI Maelstrom / UVA 432 MPI Maelstrom / SCU 1068 MPI Maelstrom / UVALive 5398 MPI Maelstrom /ZOJ 1291 MPI Maelstrom (最短路径)
    POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)
  • 原文地址:https://www.cnblogs.com/mapleChain/p/13063954.html
Copyright © 2020-2023  润新知