childProcess.spawn 指定 `env` 时失败

childProcess.spawn fails when `env` is specified

我正在使用 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 而失败。换句话说,当 any 值设置为 env 时,生成的进程将失败,因为甚至像 which 这样的内置命令也是未知的。

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

即使不通过 env,您也可以使用 /usr/bin/env

覆盖 PORT
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,
  }
});