Electron跨平台应用安装流程中如何自动完成osquery依赖安装
问题概述
- 已具备macOS、Linux、Windows全平台Electron应用安装包构建能力
- 应用依赖
osquery实现系统信息采集,要求在应用安装流程内自动完成osquery的安装与启动,无需用户单独执行osquery安装操作 - 已验证失效方案:通过
package.json中build.extraFiles引入带osquery安装命令的.sh脚本,在electron/main.js入口执行脚本,该方案无法实现依赖与应用的同步一次性安装 - 核心目标:用户单次运行Electron应用安装包,即可在同一安装流程内完成osquery依赖部署,无额外操作步骤
跨平台落地方案
不要采用应用启动后执行安装脚本的逻辑,将osquery安装动作嵌入各平台安装包的原生安装钩子,全程无感知执行。
Windows 平台
- 基于
electron-builder的NSIS安装器实现 - 提前下载对应系统架构的osquery官方MSI静默安装包,存入项目构建资源目录
- 在
package.json中添加NSIS自定义脚本配置:"build": { "nsis": { "include": "build/nsis-installer.nsh", "perMachine": true } } - 在
nsis-installer.nsh中写入安装阶段钩子,在应用文件写入完成后自动执行osquery静默安装:Section -InstallOsquery ExecWait 'msiexec /i "$INSTDIR\resources\osquery.msi" /qn /norestart' SectionEnd - 同步在NSIS卸载段添加osquery静默卸载逻辑,避免系统残留。
macOS 平台
根据分发的安装包格式选择对应实现:
- PKG格式分发:直接在PKG安装包的预安装脚本中写入osquery安装命令,安装流程自动串行执行,无需应用启动触发
- DMG格式分发:将osquery官方PKG安装包打入应用资源目录,在
main.js中添加首次启动检测逻辑,检测到系统未安装osquery时,调用系统命令静默执行安装:const { execSync } = require('child_process') const fs = require('fs') const systemOsqueryPath = '/usr/local/bin/osqueryi' if (!fs.existsSync(systemOsqueryPath)) { execSync('installer -pkg "/Applications/[你的应用名称].app/Contents/Resources/osquery.pkg" -target /', { stdio: 'ignore' }) } - 提前配置好应用的
entitlements.plist权限,避免系统拦截安装脚本执行。
Linux 平台
对应不同分发格式适配:
- DEB包:在包结构的
DEBIAN/preinst预安装脚本中写入osquery静默安装命令,添加-y参数跳过交互确认 - RPM包:在SPEC文件的
%pre预安装段写入osquery的yum/dnf静默安装命令 - AppImage包:直接将对应架构的osquery二进制文件打入AppImage资源目录,运行时直接调用内置二进制,无需写入系统路径
- 所有安装命令默认跳过用户确认步骤,不弹出交互窗口。
验证标准
- 各平台安装包均在纯净系统虚拟机中测试,安装全程无osquery相关的独立安装弹窗,不需要用户手动确认
- 应用安装完成后,osquery服务默认启动,应用可正常调用
osqueryi获取系统信息 - 应用卸载时可选择同步卸载osquery,避免影响用户设备上其他依赖osquery的程序。
内容的提问来源于stack exchange,提问作者Nitesh Kanojia
相关产品推荐
相关产品推荐

