You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron-builder新版本可用时update-available事件未触发排查求助

排查electron-builder autoUpdater update-available事件未触发的问题

遇到update-not-available正常触发但update-available没反应的情况,大概率是有未捕获的错误或者更新流程中某个环节没走通,我给你整理了一套排查方案,从加日志开始一步步定位问题:

一、先添加完整的错误监听和详细日志

首先,你当前的代码没有监听error事件,很多时候更新失败的原因都会通过这个事件抛出,同时给关键步骤加上日志,方便追踪流程:

修改你的代码,添加这些监听和日志:

const { autoUpdater } = require("electron-updater");
const { dialog, app } = require("electron"); // 确保导入了dialog和app

// 开启electron-updater的调试日志(排查核心工具)
autoUpdater.logger = require("electron-log");
autoUpdater.logger.transports.file.level = "info";

// 监听错误事件,捕获所有更新异常
autoUpdater.on("error", (err, message) => {
  console.error("更新发生错误:", err, message);
  dialog.showMessageBox({
    type: "error",
    title: "更新错误",
    message: "更新失败",
    detail: message || err.toString()
  });
});

// 在检查更新前后加日志,确认调用时机
app.on('ready', () => {
  console.log("应用就绪,开始检查更新");
  autoUpdater.checkForUpdates();
});

// 监听"检查中"事件,确认更新流程已启动
autoUpdater.on("checking-for-update", () => {
  console.log("正在检查更新...");
});

autoUpdater.on("update-not-available", (info) => {
  console.log("无可用更新:", info);
  const dialogOpts = {
      type: 'info',
      buttons: ['Ok'],
      title: 'Application Update',
      message: "Yay",
      detail: 'No new updates.'
    }
    dialog.showMessageBox(dialogOpts);
});

autoUpdater.on("update-available", (info) => {
  console.log("发现可用更新:", info);
  // 修复:从info对象中获取你需要的版本信息(之前代码未定义releaseNotes/releaseName)
  const { releaseNotes, releaseName } = info;
  const dialogOpts = {
      type: 'info',
      buttons: ['Ok'],
      title: 'Application Update',
      message: process.platform === 'win32' ? releaseNotes : releaseName,
      detail: 'A new version is being downloaded.'
    }
    dialog.showMessageBox(dialogOpts);
})

autoUpdater.on("update-downloaded", (info) => {
  console.log("更新已下载完成:", info);
  const { releaseNotes, releaseName } = info;
  const dialogOpts = {
      type: 'info',
      buttons: ['Restart', 'Later'],
      title: 'Application Update',
      message: process.platform === 'win32' ? releaseNotes : releaseName,
      detail: 'A new version has been downloaded. Restart the application to apply the updates.'
    }

    dialog.showMessageBox(dialogOpts, (response) => {
      if (response === 0) autoUpdater.quitAndInstall()
    });
});

这里几个关键修改:

  • 引入electron-log记录详细更新日志(需要先执行npm install electron-log --save安装)
  • 添加checking-for-update事件监听,确认更新检查确实被触发
  • 修复了update-available和update-downloaded中未从info对象获取版本信息的问题(之前的代码可能因变量未定义导致弹窗报错,让你误以为事件没触发)
  • 新增error事件监听,捕获所有更新过程中的异常

二、逐步排查可能的原因

有了日志之后,你可以根据输出信息进一步定位:

  • 确认更新服务器配置正确:检查package.json里的publish配置,确保仓库地址、权限令牌(如果需要)都正确,比如GitHub发布的话,要保证repository字段准确,且发布的版本号高于当前应用版本
  • 版本号格式问题:electron-builder严格遵循语义化版本号(SemVer)规则,比如1.0.0,如果新版本号格式不符合要求(比如带字母前缀、版本号逻辑错误),会被判定为无效版本
  • 测试环境的坑:不要用electron .启动开发模式测试自动更新,必须打包成正式安装包(如exe、dmg)后再测试,开发模式下自动更新逻辑不会正常工作
  • 缓存问题:electron-updater可能会缓存旧的更新信息,可以手动清除缓存后重试:
    • Windows:C:\Users\<你的用户名>\AppData\Local\<应用名称>\Cache
    • macOS:~/Library/Caches/<应用名称>
  • 网络问题:如果更新服务器在境外,可能存在网络访问失败的情况,可以在error事件日志中查看具体的网络错误信息

三、额外验证步骤

  • 手动访问更新服务器地址,确认latest.yml(macOS)或latest.json(Windows)文件存在,且文件内的版本号确实高于当前应用版本
  • 检查打包时的publish配置是否选择了正确的渠道(如github、generic等),不同渠道对应不同的更新检测逻辑

按照上面的步骤,你应该能很快定位到update-available事件未触发的原因。

内容的提问来源于stack exchange,提问作者qazxswedc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:14