如何为electron-builder生成的latest.yml加字段并阻止Win7自动更新高版本
问题解答
1. 为electron-builder生成的latest.yml添加自定义字段
有两种可靠实现方式:
方式一:通过electron-builder配置直接注入
在项目package.json的build.publish配置中添加extraMetadata字段,electron-builder会自动将这些字段写入生成的latest.yml文件中。示例配置:
{ "build": { "publish": { "provider": "generic", "url": "https://your-update-server.com/", "extraMetadata": { "supportsWin7": false, "minimumWinVersion": "6.2" } } } }
生成的latest.yml会包含自定义字段,格式示例:
version: 1.0.0 files: - url: your-app-setup.exe sha512: xxx supportsWin7: false minimumWinVersion: 6.2
方式二:通过afterPublish钩子手动修改
如果需要根据构建环境动态添加字段,可在electron-builder配置中指定afterPublish钩子脚本,手动修改生成的latest.yml:
- 在
package.json中添加钩子配置:
{ "build": { "afterPublish": "./scripts/modify-latest-yml.js" } }
- 编写
scripts/modify-latest-yml.js脚本:
const fs = require('fs'); const path = require('path'); module.exports = async (context) => { const latestYmlPath = path.join(context.outDir, 'latest.yml'); if (fs.existsSync(latestYmlPath)) { let content = fs.readFileSync(latestYmlPath, 'utf8'); content += '\nsupportsWin7: false'; fs.writeFileSync(latestYmlPath, content); } };
2. 阻止Windows 7设备更新到Electron>23的版本
结合自定义字段,在更新逻辑中加入系统版本检测与字段校验即可实现:
步骤1:检测当前系统是否为Windows 7
使用Node.js的os模块判断系统版本:
const os = require('os'); function isWindows7() { return os.platform() === 'win32' && os.release().startsWith('6.1'); }
步骤2:在更新事件中校验并拦截更新
在主进程的更新逻辑中,监听update-available事件,结合自定义字段判断是否允许更新:
const { autoUpdater, dialog } = require('electron'); autoUpdater.on('update-available', (updateInfo) => { if (isWindows7() && updateInfo.supportsWin7 === false) { autoUpdater.cancel(); dialog.showMessageBox({ type: 'warning', title: '无法更新', message: '此版本不再支持Windows 7,请保留当前版本或升级您的操作系统。' }); return; } dialog.showMessageBox({ type: 'info', title: '发现新版本', message: `版本 ${updateInfo.version} 已可用,是否立即更新?`, buttons: ['立即更新', '稍后再说'] }).then((res) => { if (res.response === 0) { autoUpdater.downloadUpdate(); } }); });
备选方案:分渠道更新
如果需要为Win7用户保留旧版本更新,可搭建两个更新通道:
- 一个通道发布支持Win7的旧版本(基于Electron≤23)
- 另一个通道发布新版本(基于Electron>23)
在应用启动时检测系统版本,自动切换更新源:
if (isWindows7()) { autoUpdater.setFeedURL({ provider: 'generic', url: 'https://your-update-server.com/win7/' }); } else { autoUpdater.setFeedURL({ provider: 'generic', url: 'https://your-update-server.com/latest/' }); } autoUpdater.checkForUpdates();
内容的提问来源于stack exchange,提问作者Elendiar
相关产品推荐
相关产品推荐

