childProcess.spawn завершается ошибкой, если указан `env` - PullRequest
0 голосов
/ 03 июня 2018

Я использую модуль 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, неизвестны.

EDIT: возможно, стоит упомянуть, чтоЯ использую Электрон.Я знаю, что Electron каким-то образом соединяет Node и Chromium, так что, может быть, это немного странно?

1 Ответ

0 голосов
/ 16 июля 2018

Вы можете переопределить ПОРТ, даже не передавая env, используя /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,
  }
});
...