Узел child_process пытается использовать / usr / bin / zsh и терпит неудачу, так как он не существует - PullRequest
0 голосов
/ 19 февраля 2020

С недавнего времени многие команды npm терпели неудачу для меня с сообщением об ошибке, похожим на это:

npm ERR! code ELIFECYCLE
npm ERR! syscall spawn /usr/bin/zsh
npm ERR! file /usr/bin/zsh
npm ERR! path /usr/bin/zsh
npm ERR! errno ENOENT
npm ERR! myProj@0.1.0 preinstall: `npm run myCommand`
npm ERR! spawn /usr/bin/zsh ENOENT
npm ERR!
npm ERR! Failed at the myProj@0.1.0 preinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:

До сих пор я обнаружил, что эта ошибка, вероятно, вызвана /usr/bin/zsh не существует zsh находится под /bin/zsh в моей системе.

Содержимое скрипта, вызывающего эту ошибку:

const { exec } = require('child_process');
exec('npm -v', (err, stdout) => {
  if (err) throw err;
  if (parseFloat(stdout) < 5) {
    // NOTE: This can happen if you have a dependency which lists an old version of npm in its own dependencies.
    throw new Error(`[ERROR] You need npm version @>=5 but you have ${stdout}`);
  }
});

, подробный стек содержит:

17 verbose stack spawn /usr/bin/zsh ENOENT
17 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
17 verbose stack     at onErrorNT (internal/child_process.js:415:16)
17 verbose stack     at process._tickCallback (internal/process/next_tick.js:63:19)

Так что, скорее всего, child_process пытается вызвать / usr / bin / zsh. Но я понятия не имею, почему и как это исправить. Любые идеи?

Эта проблема, похоже, похожа на эту: Попытка запустить одновременно (npm ERR! Код ELIFECYCLE npm ERR!)

Complete переустановка узла, npm и nvm не помогли. Ошибка также возникает при использовании пряжи.

Другая проблема отладки:

Я не могу найти internal/child_process.js или internal/process/next_tick.js.

Редактировать: Я обнаружил, что эта ошибка возникает независимо от запускаемого сценария.

Если я запускаю сценарий npm run x, определенный в пакете. json как "x"="npm run y". Это не удастся. Но если я запускаю npm run y напрямую, он работает.

1 Ответ

0 голосов
/ 20 февраля 2020

Я переопределил две меры безопасности OSX, чтобы взломать эту проблему:

  1. отключить SIP (протокол целостности системы), перезагрузившись в recovery (удерживая CMD + R), открыв Utilities -> Terminal и работает csrutil disable
  2. снятие защиты от записи / usr / bin путем запуска:

    sudo mount -uw / killall Finder

  3. Создание символической ссылки ln -s /usr/bin/zsh /bin/zsh

Теперь ошибка исчезла. Но его причина и правильное решение до сих пор неизвестны

...