指定`env`时,childProcess.spawn失败

时间:2018-06-02 22:32:19

标签: node.js shell electron child-process

我正在使用Node的childProcess模块​​来尝试运行NPM任务。

当我执行以下操作时,一切都有效:

  const child = childProcess.spawn('npm', ['run', taskName], {
    cwd: `${parentPath}/${projectId}`,
  });

但是,我需要为命令提供环境变量才能成功。我尝试使用env参数,如下所示:

  const child = childProcess.spawn('npm', ['run', taskName], {
    cwd: `${parentPath}/${projectId}`,
    env: {
      ...process.env,
      PORT: 4545,
    }
  });

当我这样做时,我收到以下错误:Uncaught Error: spawn npm ENOENT

事实证明,无论env值是什么,无论命令是什么,我都会收到此错误。例如:

  const child = childProcess.spawn('which', ['npm'], {
    cwd: `${parentPath}/${projectId}`,
    env: process.env,
  });

此代码以Uncaught Error: spawn which ENOENT失败。换句话说,当任何值设置为env时,生成的进程将失败,因为即使是which之类的内置命令也是未知的。

编辑:也许值得一提的是我正在使用Electron。我知道Electron会以某种方式融合Node和Chromium,所以也许这有些怪癖?

1 个答案:

答案 0 :(得分:1)

您甚至可以使用env来覆盖PORT,即使不通过/usr/bin/env

const child = childProcess.spawn('env', ['PORT=4545', 'npm', 'run', taskName], {
  cwd: `${parentPath}/${projectId}`,
});

如果您尚未选中process.env,请确保使用已知有效的值覆盖PATH

const child = childProcess.spawn('npm', ['run', taskName], {
  cwd: `${parentPath}/${projectId}`,
  env: {
    PATH: '/bin:/usr/bin:/usr/local/bin',
    PORT: 4545,
  }
});