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