如何用Electron-Forge构建安装时创建Windows服务的MSI/EXE
使用Electron-Forge构建带Windows服务的安装包
要实现安装时自动创建Windows服务,你需要结合node-windows工具和Electron-Forge的打包配置,以下是具体步骤:
1. 安装必要依赖
首先安装node-windows(用于创建Windows服务):
npm install node-windows --save-dev
若项目未通过Electron-Forge初始化,先执行:
npx create-electron-app my-app && cd my-app
2. 编写服务注册脚本
在项目根目录创建install-service.js,用于注册Windows服务:
const { Service } = require('node-windows'); const path = require('path'); // 安装后应用EXE的路径(根据实际应用名称修改) const appExePath = path.join(process.env.PROGRAMFILES, 'MyApp', 'MyApp.exe'); const svc = new Service({ name: 'MyApp后台服务', description: 'MyApp的后台运行服务', script: appExePath, args: ['--service'], // 传递参数标识服务模式 env: [{ name: 'NODE_ENV', value: 'production' }] }); // 安装完成后自动启动服务 svc.on('install', () => { svc.start(); }); // 执行服务安装 svc.install();
3. 编写服务模式判断逻辑
修改Electron主进程文件(如main.js),区分服务模式与GUI模式:
const { app } = require('electron'); // 检查是否以服务模式启动 const isService = process.argv.includes('--service'); if (isService) { // 服务模式:仅运行后台逻辑,不创建窗口 app.whenReady().then(() => { console.log('MyApp后台服务已启动'); // 在这里编写你的后台业务逻辑,比如API监听、定时任务等 }); // 服务模式下禁止自动退出 app.on('window-all-closed', () => { if (process.platform !== 'darwin') { // 不执行app.quit(),保持服务运行 } }); } else { // 正常GUI模式:创建应用窗口 app.whenReady().then(() => { const { BrowserWindow } = require('electron'); const mainWindow = new BrowserWindow({ width: 800, height: 600 }); mainWindow.loadFile('index.html'); }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); }
4. 配置Electron-Forge打包规则
修改项目根目录的forge.config.js,配置安装后执行服务注册脚本:
针对EXE安装包(Squirrel)
module.exports = { packagerConfig: { icon: './icons/icon.ico', // 替换为你的应用图标路径 extraResource: ['./install-service.js'] // 将服务脚本打包进安装包 }, makers: [ { name: '@electron-forge/maker-squirrel', config: { name: 'MyApp', setupExe: 'MyApp安装包.exe', setupIcon: './icons/icon.ico', postInstall: './install-service.js' // 安装完成后执行服务注册 } } ], plugins: [ { name: '@electron-forge/plugin-auto-unpack-natives', config: {} } ] };
针对MSI安装包
MSI打包需额外处理,推荐通过主进程首次运行时注册服务:
- 在
main.js中添加首次运行检测,若未注册服务则调用node-windows的安装逻辑 - 使用
electron-sudo工具提升权限执行服务注册脚本
5. 测试打包与安装
运行打包命令生成安装包:
npm run make
安装生成的EXE/MSI文件后,打开Windows服务管理器(services.msc),即可看到你注册的服务,状态应为正在运行。
注意事项
- 服务注册需要管理员权限,Electron-Forge生成的安装包默认会请求管理员权限
- 确保
install-service.js中的应用路径与实际安装路径一致 - 若服务启动失败,可查看
node-windows生成的日志文件(默认在%TEMP%目录下)排查问题
内容的提问来源于stack exchange,提问作者hongdou
相关产品推荐
相关产品推荐

