如何为Electron Forge的Wix MSI安装器实现自动更新机制?
为Wix MSI安装器实现Electron自动更新机制
1. 复用现有自动更新核心逻辑
Electron的autoUpdater模块本身不依赖Squirrel,只是Squirrel是默认Windows更新后端。你之前基于latest.yml的更新检查逻辑可以直接保留,只需要替换更新后端为支持MSI的方案,无需大幅修改应用内的更新触发代码。
2. 替换更新后端为MSI兼容方案
放弃Squirrel的nupkg更新方式,改用MSI安装包完成更新:
- 当
autoUpdater检测到新版本时,下载对应版本的MSI安装包(而非Squirrel的nupkg文件) - 下载完成后,调用系统命令启动MSI静默安装,示例参数:
msiexec /i 路径/new-version.msi /qn,实现无弹窗自动升级 - 注意:MSI版本号必须符合Windows Installer规则(格式为
x.x.x.x,前三位为主版本,第四位为修订号),且所有版本的ProductCode需保持一致,UpgradeCode必须固定,确保Windows Installer识别为同一应用的升级。
3. 调整latest.yml配置
修改原Squirrel格式的latest.yml,适配MSI更新:
version: 1.1.0 url: https://你的发布服务器地址/app-v1.1.0.msi sha256: 安装包的SHA256校验值
url字段指向新版本MSI的下载地址version与MSI安装包的版本号严格一致- 保留
sha256用于校验安装包完整性
4. 编写更新完成后的执行逻辑
监听autoUpdater的update-downloaded事件,处理应用关闭与MSI启动:
const { autoUpdater, app } = require('electron-updater'); const { exec } = require('child_process'); const path = require('path'); // 配置更新源 autoUpdater.setFeedURL({ provider: 'generic', url: 'https://你的发布服务器地址/releases/' }); // 监听更新下载完成事件 autoUpdater.on('update-downloaded', (info) => { // 关闭当前应用实例 app.quit(); // 启动MSI静默安装 const msiPath = path.join(info.downloadedFile); exec(`msiexec /i "${msiPath}" /qn`, (err) => { if (err) console.error('更新安装失败:', err); }); });
5. 配置Electron Forge的Wix构建参数
在forge.config.js中切换构建器为Wix,并固定关键配置:
module.exports = { // 其他配置... makers: [ { name: '@electron-forge/maker-wix', config: { language: 1033, upgradeCode: '固定的GUID字符串', // 必须全局唯一且所有版本保持一致 version: require('./package.json').version, // 与package.json版本同步 // 可选:配置安装目录、快捷方式等Wix参数 } } ] };
6. 测试更新流程
- 发布旧版本MSI并安装到测试机
- 上传新版本MSI和对应
latest.yml到发布服务器 - 启动旧版本应用,验证更新检测、下载、静默安装、重启到新版本的全流程是否正常
内容的提问来源于stack exchange,提问作者Riki Ahmad
相关产品推荐
相关产品推荐

