后两种是有效的,而且这个问题可能只出现在某些机器上。某些机器是正确的,某些机器却不正确。
electron-builder 打包后卸载或者更改程序中的发布者名称问题首先说这个发布者是哪个字段,其实是package.json里面的author字段的name属性,当然可以有多种写法。
如果的你名字类似 牛潮(北京)有限公司,那么你打包出来就只会剩下 牛潮两个字,是不是有一些神奇。
这个其实是 electron-builder库packages\app-builder-lib\src\util\normalizePackageData.ts 或者额是 normalize-package-data库做了一些操作。
unParsePerson之后再parsePerson,英文括弧后面的东西就没了。怎么办,我现在是手动找到修改一下。
他这个打包可以签名,但是要你提供.pfx文件和密码。
这就有点老火了,公司的这两个东西一般不会轻易给你。
要么你们有统一的打包中心,那就没问题。
可惜我们公司只有统一的签名中心,签名之后,exe文件是有变化的,比如大小和最后修改时间,这就会导致更新的时候,检查hash值会失败。
问题不大:
我们先到electron-buider的源码里面packages\app-builder-lib\src\util\hash.ts找到hash值生成的方法,这个hash值会被写入latest.yml文件里面
本地打包好exe
去签名中心签名,并覆盖本地的exe
用hash.ts相同的方式再计算得到hash值
回写这些值到latest.yml文件
基本就是这样啦。
这里送一段基本能用的代码吧:
import { createHash } from "crypto" import { createReadStream, statSync , readFileSync, writeFileSync } from "fs" import path from "path"; import YAML from "yaml"; const jsonConfig = require("../package.json"); const version = jsonConfig.version; const exeFilePath = path.join(__dirname, `../packages/${version}.exe`); const yamlFilePath = path.join(__dirname, "../packages/latest.yml"); const jsFilePath = path.join(__dirname, "../packages/latest.js"); const bakYamlFilePath = path.join(__dirname, `../packages/latest.bak.yml`); // packages\app-builder-lib\src\util\hash.ts function hashFile(file: string, algorithm = "sha512", encoding: "base64" | "hex" = "base64", options?: any): Promise<string> { return new Promise<string>((resolve, reject) => { const hash = createHash(algorithm) hash.on("error", reject).setEncoding(encoding) createReadStream(file, { ...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */ }) .on("error", reject) .on("end", () => { hash.end() resolve(hash.read() as string) }) .pipe(hash, { end: false }) }) } function getFileSize(path: string){ const state = statSync(path); return state.size; } function getYAML(path: string){ const file = readFileSync(path, 'utf8') const data = YAML.parse(file); return data; } function saveYAML(path:string, content: any){ writeFileSync(path, YAML.stringify(content)) } function saveJS(path:string, content: string){ writeFileSync(path, content) } ;(async function updateLatestYML(){ try{ const hash = await hashFile(exeFilePath); const size = getFileSize(exeFilePath); console.log("hash:", hash); console.log("size:", size); const yamlData = getYAML(yamlFilePath); saveYAML(bakYamlFilePath, yamlData); console.log("yamlData:before", yamlData); const name = `${version}.exe` yamlData.version = version; const file = yamlData.files[0]; file.url = name; file.sha512 = hash; file.size = size; yamlData.path = name; yamlData.sha512 = hash; console.log("yamlData:after", yamlData); saveYAML(yamlFilePath, yamlData); saveJS(jsFilePath, `window._lastest=${JSON.stringify(yamlData)}`); }catch(err){ console.log("update latest.yml 失败", err); } })(); 本地测试electron-updater的问题
https://stackoverflow.com/questions/51003995/how-can-i-test-electron-builder-auto-update-flow
虽然官方建议单独使用一个啥server来着,总让人觉得有点复杂,其实还是可以直接在开发中测试的。
复制 resources\app-update.yml,重名命令dev-app-update.yml
build时复制到dist目录
代码层面做一点小修改
function checkUpdate() { // 开发环境 if(!app.isPackaged){ return autoUpdater.checkForUpdates(); } return autoUpdater.checkForUpdatesAndNotify(); }这里还要额外注意
版本检查的是electron的版本,所以latest.yml的版本要大
缓存的默认目录为 %localappdata%/{默认是package.json里面name}-updater/pending,和electron-builder里面的是指有关
404返回的页面不会触发did-fail-load