如何配置Electron/Electron-Forge实现asar仅打包指定目录其余文件外置
解决方案
方案一:原生配置实现单app.asar结构(推荐,符合第二种期望结构)
不需要手动写脚本处理asar,直接通过Electron Forge的配置即可实现,Electron原生适配无需额外修改模块逻辑。
修改你的forge.config.js核心配置如下:
module.exports = { packagerConfig: { // 开启asar,指定仅将目标内容打包进app.asar asar: { patterns: [ "package.json", // 必须保留,Electron需要读取入口配置 "sources/**/*", "node_modules/**/*" ] }, // 将不需要进asar的目录复制到resources/app下 extraResource: [ { from: "executable", to: "app/executable" }, { from: "images", to: "app/images" } ], // 确认入口路径和asar内结构匹配,比如入口是sources下的index.js main: "sources/index.js" }, // 其余你的makers、plugins等配置保持不变 }
注意事项
- 只需保证
package.json里的main字段指向的路径和asar内的入口文件路径一致即可,Electron会自动优先从app.asar内读取对应文件 - 访问外部的
executable、images目录资源时,直接用path.join(app.getAppPath(), 'executable/目标文件')即可,Electron发现asar内无对应路径时会自动查找外部的app目录,完全符合要求的自动识别逻辑。
方案二:双asar独立打包结构(符合第一种期望结构)
如果需要单独打包sources.asar和node_modules.asar,按以下步骤配置:
- 先关闭默认asar打包,在
forge.config.js的packagerConfig里设置asar: false - 添加
afterPack钩子,在构建完成后调用asar包手动打包两个目录:
const asar = require('asar') const path = require('path') const fs = require('fs-extra') module.exports = { packagerConfig: { asar: false, // 复制不需要打包的目录到输出位置 extraResource: [ "executable", "images" ] }, hooks: { afterPack: async (config, buildPath, electronVersion, platform, arch) => { const resourcesPath = path.join(buildPath, 'resources', 'app') // 打包sources为asar await asar.createPackage(path.join(__dirname, 'sources'), path.join(resourcesPath, 'sources.asar')) // 打包node_modules为asar await asar.createPackage(path.join(__dirname, 'node_modules'), path.join(resourcesPath, 'node_modules.asar')) // 删除原本复制过去的未打包sources和node_modules await fs.remove(path.join(resourcesPath, 'sources')) await fs.remove(path.join(resourcesPath, 'node_modules')) } } }
- 在你的项目入口文件最顶部添加模块解析配置,让Electron识别两个单独的asar:
const { app } = require('electron') const path = require('path') // 将node_modules.asar加入全局模块搜索路径 require('module').globalPaths.push(path.join(app.getAppPath(), 'node_modules.asar')) // 加载sources.asar内的业务入口 require(path.join(app.getAppPath(), 'sources.asar', 'index.js'))
内容的提问来源于stack exchange,提问作者Joost Baars
相关产品推荐
相关产品推荐

