【问题标题】:Spawn child node process from Electron从 Electron 生成子节点进程
【发布时间】:2017-11-08 09:16:15
【问题描述】:

我有一个从 CLI 运行的现有节点脚本,例如 node script.js --args。

我正在尝试构建一个 Electron 应用程序来替换 CLI。要运行实际的脚本,我可以使用child_process:

function run(arg) {
    const script = spawn("node", ["./script.js", "run", "--arg", arg], { cwd: TOOLS_DIR, env: process.env });

    script.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
    });

    script.stderr.on('data', (data) => {
        console.log(`stderr: ${data}`);
    });

    script.on('close', (code) => {
        console.log(`child process exited with code ${code}`);
    });
}

但这仅在我从我的应用程序文件夹启动 electron 时才有效。当我使用 electron-packager 运行构建的应用程序时,run() 调用失败并出现错误:

Uncaught Error: spawn node ENOENT

构建的应用似乎无法运行node 命令。我安装了 NodeJS,但如果我登录 process.env.PATH,我注意到从构建的应用程序 /usr/local/bin(node 所在的位置)不在 $PATH 中,但如果我从我的应用程序文件夹运行 electron,它是。无论哪种情况,由于 Electron 在 NodeJS 上运行,是否有一种简单的方法可以从 Electron 应用程序运行节点脚本?

【问题讨论】:

  • 您是否正在尝试制作一个在 scripts.js 中启动 Node.JS 应用程序的 Electron 应用程序?
  • 基本上,是的。我的 script.js 实际上使用 docker-compose 启动了一些 docker 映像。我尝试使用fork() 而不是spawn() 并且可以运行脚本而不会与env 混淆,但后来我在脚本中的docker-compose 上得到了ENOENT。

标签: node.js electron child-process


【解决方案1】:

对于任何感兴趣的人,我最终通过结合使用 fork()(它使用 Electron 打包的 NodeJS 运行时而不是依赖于客户端计算机上安装的 NodeJS)和修补 env 的 @ 来解决我的问题。 987654325@(允许script.js 命令自身产生一些命令):

const env = { ...process.env, PATH: `${process.env.PATH}:/usr/local/bin` };
const child = fork("./script.js", args, { cwd: TOOLS_DIR, env, silent: true });

不完整的$PATH 是Electron 中的一个已知问题,有fix-path 库作为解决方案,但由于某种原因我无法让它工作。

【讨论】:

  • 老兄...你救了我!!!
猜你喜欢
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
相关资源
最近更新 更多