electron踩坑系列之一 (2)

后两种是有效的,而且这个问题可能只出现在某些机器上。某些机器是正确的,某些机器却不正确。

electron-builder 打包后卸载或者更改程序中的发布者名称问题

首先说这个发布者是哪个字段,其实是package.json里面的author字段的name属性,当然可以有多种写法。

如果的你名字类似 牛潮(北京)有限公司,那么你打包出来就只会剩下 牛潮两个字,是不是有一些神奇。

这个其实是 electron-builder库packages\app-builder-lib\src\util\normalizePackageData.ts 或者额是 normalize-package-data库做了一些操作。
unParsePerson之后再parsePerson,英文括弧后面的东西就没了。怎么办,我现在是手动找到修改一下。

function fixPeople(data: any) { modifyPeople(data, unParsePerson) modifyPeople(data, parsePerson) }, function unParsePerson (person) { if (typeof person === "string") return person var name = person.name || "" var u = person.url || person.web var url = u ? (" ("+u+")") : "" var e = person.email || person.mail var email = e ? (" <"+e+">") : "" return name+email+url } function parsePerson (person) { console.log("parsePerson person", person) if (typeof person !== "string") return person var name = person.match(/^([^\(<]+)/) var url = person.match(/\(([^\)]+)\)/) var email = person.match(/<([^>]+)>/) var obj = {} if (name && name[0].trim()) obj.name = name[0].trim() if (email) obj.email = email[1]; if (url) obj.url = url[1]; return obj } electron-builder打包签名问题

他这个打包可以签名,但是要你提供.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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyygsf.html