Electron updater系统级安装后更新至用户级导致应用重复问题咨询
解决方案:控制Electron应用MSI安装后的更新路径
一、通过electron-builder绑定MSIINSTALLPERUSER参数控制更新目录
electron-updater的行为由electron-builder配置主导,你可以通过配置区分系统/用户级安装的更新路径,同时在主进程中读取安装标记做适配:
动态配置更新路径
在electron-builder.yml或package.json的build字段中添加如下配置:win: target: - target: msi arch: [x64] parameters: - /norestart - MSIINSTALLPERUSER="{{MSIINSTALLPERUSER}}" publish: provider: generic url: "https://你的更新服务器地址/"主进程中读取安装类型(通过注册表判断:系统级安装在HKLM,用户级在HKCU),强制更新器使用对应目录:
const { app } = require('electron'); const { autoUpdater } = require('electron-updater'); const regedit = require('regedit'); // 判断当前安装是系统级还是用户级 async function getInstallType() { return new Promise(resolve => { regedit.list('HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\你的应用GUID', (err) => { if (!err) resolve('system'); else { regedit.list('HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\你的应用GUID', (err2) => { resolve(err2 ? 'unknown' : 'user'); }); } }); }); } async function setupAutoUpdater() { const installType = await getInstallType(); if (installType === 'system') { // 系统级更新路径 autoUpdater.updateConfigPath = 'C:\\Program Files\\messenger-updater\\update-info.json'; autoUpdater.downloadedUpdatePath = 'C:\\Program Files\\messenger-updater\\pending'; } else { // 用户级更新路径 autoUpdater.updateConfigPath = `${app.getPath('appData')}\\messenger-updater\\update-info.json`; autoUpdater.downloadedUpdatePath = `${app.getPath('appData')}\\messenger-updater\\pending`; } autoUpdater.checkForUpdates(); } app.whenReady().then(setupAutoUpdater);强制仅系统级更新
若不需要用户级更新,直接在配置中固定系统级更新路径,同时限制更新需管理员权限:win: target: - target: msi arch: [x64] parameters: - /norestart - MSIINSTALLPERUSER="" publish: provider: generic url: "https://你的更新服务器地址/"主进程中添加权限校验与路径固定:
const { app, dialog } = require('electron'); const { autoUpdater } = require('electron-updater'); const isAdmin = require('is-admin'); app.whenReady().then(async () => { if (!(await isAdmin())) { dialog.showErrorBox('更新提示', '系统级应用更新需管理员权限,请重新以管理员身份启动'); return; } // 固定更新路径到系统目录 autoUpdater.updateConfigPath = 'C:\\Program Files\\messenger-updater\\update-info.json'; autoUpdater.downloadedUpdatePath = 'C:\\Program Files\\messenger-updater\\pending'; autoUpdater.checkForUpdates(); });
二、清理重复图标与用户级安装目录
更新完成后自动清理用户级安装残留,避免双图标:
const fs = require('fs-extra'); const { app } = require('electron'); autoUpdater.on('update-installed', () => { const userAppDir = `${app.getPath('localAppData')}\\Programs\\Messenger`; const userShortcut = `${app.getPath('desktop')}\\Messenger.lnk`; // 删除用户级安装目录 if (fs.existsSync(userAppDir)) fs.removeSync(userAppDir); // 删除用户桌面快捷方式 if (fs.existsSync(userShortcut)) fs.unlinkSync(userShortcut); autoUpdater.quitAndInstall(); });
三、MSI安装包优化:统一快捷方式位置
在electron-builder配置中指定系统级安装的快捷方式仅创建在公共桌面,避免用户桌面重复生成:
win: target: - target: msi arch: [x64] parameters: - /norestart - MSIINSTALLPERUSER="" shortcutName: "Messenger" commonShortcuts: true # 系统级安装时生成公共桌面快捷方式
内容的提问来源于stack exchange,提问作者Ismoil Shokirov
相关产品推荐
相关产品推荐

