MacOS下,Electron-builder可以很方便的为测试包app打更新信息(latest-mac.yml)。
但是,正式发布的时候,不可能用测试包app,因为还没有进行公证。如何为公证的app打latest-mac.yml呢。
其实观察latest-mac.yml,其实里面就只有一些比较重要的信息:
<前端>Electron-builder为公证后的app打更新信息latest.yml-LMLPHP

1.sha512: 这个其实是打出来的zip包(如这里的abc.zip)的SHA512哈希值的Base64编码。可以通过nodejs生成出来。

// 计算文件的SHA512哈希值,以及进行Base64编码
function calculateSHA512(filePath) {
  return new Promise((resolve, reject) => {
    const hash = crypto.createHash('sha512')
    const stream = fs.createReadStream(filePath)

    stream.on('data', (data) => {
      hash.update(data);
    })

    stream.on('end', () => {
      const sha512 = hash.digest('base64');
      resolve(sha512);
    })

    stream.on('error', (error) => {
      reject(error);
    })
  })
}

2.文件大小: zip的文件大小,fs.stat获取。
3.文件名: 其实就是zip的文件名,这里一定要到时候放在服务器下面的zip名称一样。


其实,我们可以将公证后的app压缩成zip,然后获取zip的这些值。最后替换掉latest-mac.yml中的这些值。一样也能起到效果。最终使用electron-updater更新后,就是这个公证之后的包。
这里给一个参考代码:


// 改变latest-mac.yml(一开始为abc-未公证.zip打的更新信息包),为abc.zip(公证包)的信息
// 需要更改files[0].url、files[0].sha512、files[0].size和path、sha512。其余不用修改
async function changeLatestMacYml() {
  if (fs.existsSync(zipRelativePath) && fs.existsSync(ymlRelativePath)) {
    const statObj = fs.statSync(zipRelativePath)
    const size = ('size' in statObj) ? statObj['size'] : 0
    const sha512Base64 = await calculateSHA512(zipRelativePath)
    console.log('size: ', size)
    console.log('sha512Base64: ', sha512Base64)

    // 通过yaml更改latest-mac.yml信息为公证后的zip的信息
    if (size > 0 && sha512Base64.length > 0) {
      const oldYamlData = fs.readFileSync(ymlRelativePath, 'utf8')
      const obj = yaml.load(oldYamlData)

      if (obj) {
        obj.files[0].url = 'abc.zip'
        obj.files[0].sha512 = sha512Base64
        obj.files[0].size = size
        obj.path = 'abc.zip'
        obj.sha512 = sha512Base64
      }

      const newYamlData = yaml.dump(obj)
      fs.writeFileSync(ymlRelativePath, newYamlData, 'utf8')
    }
  }
}

这里用到了一个解析yml文件为Object的库:js-yaml,下载即可。

04-24 06:41