Electron自动更新调用quitAndInstall时提示无法定位更新包错误
问题相关环境信息
- Electron-Builder 版本:22.14.2
- Node 版本:16.14.2
- Electron 版本:13.1.9
- Electron 分支类型:current(正式稳定版)
- 构建目标:当前为MacOS平台,后续需兼容WML
问题现象
执行Electron应用自动更新流程时,更新包下载完成后调用autoUpdater.quitAndInstall()方法准备安装更新,程序立即抛出如下错误:
[Error: Could not locate update bundle for com.github.Electron within file:///Users/lucas/Library/Caches/com.github.Electron.ShipIt/update.erv01nk/]
{ code: 2, domain: 'SQRLUpdaterErrorDomain' }
Error: Could not locate update bundle for com.github.Electron within file:///Users/lucas/Library/Caches/com.github.Electron.ShipIt/update.erv01nk/
错误中文释义:该错误为Mac端Squirrel.Mac更新器抛出的匹配类错误,错误码2,含义为无法在指定的更新缓存目录下找到Bundle ID为com.github.Electron的应用更新包
故障原因
该错误核心是更新器无法在下载解压后的缓存目录里匹配到对应标识的应用包,常见触发场景有4种:
- electron-builder配置未自定义
appId,默认沿用了Electron官方示例的com.github.Electron标识,和实际打包签名的应用标识不匹配 - 测试场景不符合要求:在
electron .启动的开发环境、或者直接打开dmg镜像内未复制到「应用程序」目录的程序上测试自动更新,Squirrel不支持这类场景的更新安装 - 更新配置文件不匹配:上传到更新服务器的
latest-mac.yml里记录的包信息、校验值和实际安装包不一致,导致解压后的包结构不符合更新器预期 - 应用未正确签名公证,或者缓存目录权限异常,导致更新包解压后结构损坏、被系统权限拦截无法读取
修复方案
- 第一步:修改electron-builder配置,替换默认appId为你自己的应用唯一标识,配置参考:
// electron-builder配置片段 { "appId": "com.你的域名.你的应用名", "productName": "你的应用正式名称", "mac": { "category": "你的应用分类", "identity": "你的签名证书名称" } }
配置修改后重新打包生成安装包和对应的latest-mac.yml,同步上传到更新服务器。
- 第二步:更换测试场景:将新打包的安装包拖拽到Mac「应用程序」目录完成安装,从应用目录启动程序后再测试自动更新流程,禁止在开发环境、dmg镜像直接运行的场景下测试更新。
- 第三步:校验更新配置:打开构建生成的
latest-mac.yml,确认文件内记录的安装包名称、版本号、sha512校验值和你上传到更新服务器的安装包完全一致,不要手动修改yml文件内容。 - 第四步:检查更新缓存目录:测试前可以手动删除
~/Library/Caches/[你的appId].ShipIt/目录下的所有历史缓存文件,避免旧版本残留的损坏更新包干扰流程。 - 跨平台兼容注意事项:后续适配WML(Windows/Linux)平台时,Windows端NSIS包要统一安装权限(要么全用当前用户安装、要么全用全用户安装,不要混用),Linux端对应deb/rpm包要配置正确的目录读写权限,避免更新时出现权限不足、路径不匹配的同类问题。
内容的提问来源于stack exchange,提问作者Lucas Lomeu
相关产品推荐
相关产品推荐

