You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron+Webpack应用:开发模式可运行二进制Node模块,生产模式为何失效?

解决Electron-Forge Webpack打包后无法找到@loadmill/agent二进制的问题

问题场景

基于Electron-Forge Webpack+TypeScript+React的macOS应用,使用Node.js spawn启动@loadmill/agent后台子进程(未显式import该包)。开发模式yarn start运行正常,但生产模式yarn package打包后,运行时抛出错误:

Uncaught Exception:
Error: spawn loadmill-agent ENOENT
at Process.ChildProcess._handle.onexit (node:internal/child_process:282:19)
at onErrorNT (node:internal/child_process:477:16)
at processTicksAndRejections (node:internal/process/task_queues:83:21)

调试确认错误根源为/bin/sh: loadmill-agent: command not found,Webpack未将@loadmill/agent的二进制文件打包进应用。


解决方案

方案1:配置Webpack打包并正确引用二进制路径

Webpack默认不会处理二进制文件,需通过插件复制文件到打包目录,并动态获取路径:

  1. 安装copy-webpack-plugin:
yarn add copy-webpack-plugin --dev
  1. 修改主进程Webpack配置文件(如webpack.main.config.js),添加插件复制二进制文件:
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
  // 原有配置...
  plugins: [
    new CopyWebpackPlugin({
      patterns: [
        {
          from: 'node_modules/@loadmill/agent/bin',
          to: 'node_modules/@loadmill/agent/bin'
        }
      ]
    })
  ]
};
  1. 在代码中动态生成二进制文件的绝对路径,替代直接调用loadmill-agent:
import { join } from 'path';
import { spawn } from 'child_process';

// 打包后主进程的__dirname指向app.asar.unpacked目录,确保可访问二进制
const agentBinaryPath = join(__dirname, '..', 'node_modules', '@loadmill', 'agent', 'bin', 'loadmill-agent');

const childProcess = spawn(agentBinaryPath, ['你的参数'], {
  stdio: 'inherit'
});
  1. 可选:在forge.config.js中配置asarUnpack,将二进制目录排除在asar包外(避免asar内文件无法执行):
module.exports = {
  packagerConfig: {
    asarUnpack: ['node_modules/@loadmill/agent/bin/**/*']
  }
};

方案2:修复环境变量PATH,让系统找到二进制

通过调整PATH或使用工具包,确保打包后的应用能找到node_modules/.bin下的loadmill-agent:

方式A:使用fix-path包

  1. 安装依赖:
yarn add fix-path
  1. 在主进程入口文件最顶部调用修复:
import fixPath from 'fix-path';

// 修复PATH,包含全局和本地node_modules/.bin路径
fixPath();

// 之后正常调用spawn
const childProcess = spawn('loadmill-agent', ['你的参数'], {
  stdio: 'inherit'
});

方式B:手动添加本地bin目录到PATH

import { join } from 'path';
import { spawn } from 'child_process';
import { env } from 'process';

// 拼接本地node_modules/.bin路径
const localBinPath = join(__dirname, '..', 'node_modules', '.bin');
// 更新PATH环境变量
env.PATH = `${localBinPath}:${env.PATH}`;

const childProcess = spawn('loadmill-agent', ['你的参数'], {
  stdio: 'inherit',
  env: { ...env }
});

注意事项

  • 确保@loadmill/agent被添加到dependencies而非devDependencies,否则打包时会被忽略。

内容的提问来源于stack exchange,提问作者Gilad Gur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:45:45