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

Jos*_*eau 6 shell child-process node.js electron

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

当我执行以下操作时,一切工作文件:

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

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

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

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

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

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

此代码失败Uncaught Error: spawn which ENOENT.换句话说,当任何值设置为env,则生成的进程失败,因为甚至内置命令which都是未知的.

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

Cha*_*ffy 5

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

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

如果您尚未选中process.env,请确保您PATH使用已知良好的值进行覆盖。

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