Electron自动更新时主进程崩溃导致更新失败怎么办?
我在用Electron的autoUpdater实现自动更新,按官方文档写了基本逻辑,但每次主进程崩溃时更新流程就中断了。
代码是这样写的:
const { autoUpdater } = require('electron');
autoUpdater.setFeedURL('https://update.myapp.com');
autoUpdater.on('update-downloaded', () => {
autoUpdater.quitAndInstall();
});
autoUpdater.checkForUpdates();
测试时故意让主进程报错崩溃,发现根本没触发’update-downloaded’事件。难道必须保证主进程存活才能更新?有没有办法让更新进程独立运行?
但这个问题有解法,核心思路是:把更新状态持久化,下次启动时继续。
先说你代码的问题,太简单了,完全没有容错机制。建议改成这样:
另外,我更推荐用electron-updater代替原生autoUpdater,它是electron-builder生态的一部分,功能完善很多。它支持增量更新、支持更多平台特性,而且内部已经帮你处理了很多边界情况。
还有个坑要注意,Windows上用Squirrel框架时,更新完成后会有个临时文件,electron-updater会自动处理这些,原生autoUpdater你得自己管。
最后说一句,主进程频繁崩溃本身就是个大问题,建议加上crashReporter收集崩溃日志,把根本原因找出来修掉。更新机制再健壮,也扛不住应用本身不稳定。
首先需要明确的是,当主进程崩溃时确实会导致所有事件监听中断,这是Node.js单线程模型决定的。所以我们要做的是在主进程挂掉之前确保更新包已经下载并准备好安装。
这里推荐一个更可靠的方案:使用独立的更新器进程。这个方案的核心思想是创建一个专门负责更新的小型Electron应用,它的唯一职责就是处理更新相关的事情。下面是具体实现步骤:
第一步,创建一个单独的更新器项目,结构可以很简单:
第二步,在这个独立的更新器里写核心逻辑:
第三步,在你的主应用中修改更新逻辑:
为什么要这样做?因为即使主进程崩溃了,这个独立的更新器仍然会继续运行。它会在后台默默地检查更新、下载更新包,并在适当的时候执行安装。通常我们会设置一个延迟(比如代码中的5秒),以便让主应用有时间优雅地退出。
另外几个需要注意的点:
1. 独立更新器应该保持精简,只包含必要的依赖
2. 要处理好更新器本身的版本管理,避免出现更新器本身也需要更新的情况
3. 可以考虑在安装包里同时打包主应用和更新器,保证它们能同步更新
这个方案虽然稍微复杂一点,但能显著提高自动更新的可靠性。我之前在开发企业级桌面应用时就遇到过类似问题,最后就是用这种方式彻底解决了主进程崩溃导致更新失败的问题。