方案一

必看

我们使用Electron Builder打包,使用Electron Updater实现全量更新,下文的配置可能与此有关联,但是所占篇幅不多,可以参考。

思路

  1. 区分业务代码和node_modules
  2. 上传配置文件、增量包和全量包到OSS
  3. 点击检查更新按钮时,获取远程配置文件版本号,与本地版本号比较。如需更新,则判断远程版本号是4位还是3位,如果是4位,则下载全量包;如果是3位,则下载增量包。如不需更新,则弹出已经是最新版本的提示
  4. 如果是全量更新,则走原有的electron-updater的逻辑;如果是增量更新,则解压已下载的增量包,并替换,替换完成后再刷新页面。

实现

不打包业务代码package.json

参考文档:configuration

"asar": true,
"asarUnpack":[
  "./dist/electron",
  "./package.json"
],

添加压缩包依赖

例如:adm-zip

获取应用当前版本号

const { app } = require('electron').remote
const currentVersion = app.getVersion()
console.log('currentVersion', currentVersion)

下载远程配置文件,读取最新版本号

const fs = require('fs')
const ymlBuffer = fs.readFileSync('./resources/latest.yml')
const remoteVersion = JSON.stringify(ymlBuffer.toString()).split('\\n')[0].split(' ')[1]
console.log('remoteVersion', remoteVersion)

比较版本号,判断是否需要更新

规定:如果remoteVersion是4位版本号,则表示全量更新;如果是3位版本号,则表示增量更新

const remoteVersionArr = remoteVersion.split('.')
if (remoteVersionArr.length === 4) {
  console.log('开始全量更新')
  return 1
}
console.log('开始增量更新')
const currentVersionArr = currentVersion.split('.')
let updateFlag = false
if (Number(remoteVersionArr[0]) > Number(currentVersionArr[0])) {
  updateFlag = true
} else {
  if (Number(remoteVersionArr[1]) > Number(currentVersionArr[1])) {
    updateFlag = true
  } else {
    if (Number(remoteVersionArr[2]) > Number(currentVersionArr[2])) {
      updateFlag = true
    }
  }
}
if (!updateFlag) {
  console.log('已经是最新版本')
  Message({
    message: '增量更新结束,已经是最新版本'
  })
  return 2
}

下载增量包,解压替换文件

// 同步解压缩
const unzip = new AdmZip('./resources/app.asar.unpacked.zip')
unzip.extractAllTo('./resources/app.asar.unpacked/', true)
console.log('app.asar.unpacked.zip 解压缩完成')

更新窗口

BrowserWindow.getAllWindows().forEach(win => {
  win.webContents.reload()
})
console.log('webContents reload完成')

隐患

  1. 增量包解压可能失败,甚至影响源文件,目前代码中未考虑此种情况

核心源文件

方案二

将业务代码部署到web服务器,然后使用electron加载http形式的URL,正在研究中

添加新评论