npm ci выводит ошибки с угловым значением 8 и узлом 12 в Windows: пересборка node-gyp

12

Моя настройка:

  • Windows 10
  • NVM 1.1.7 для Windows
  • узел 12.14.1 с нпм 6.13.4
  • Угловой 8.2.14 с @ angular / cli 8.3.22

Просто пытаюсь запустить стандартный угловой шаблон:

> npm install -g @angular/cli # this installed the angular version mentioned above
> ng new test # Chose default options for the project
> cd test
> npm ci # lots of error messages

Последняя команда приводит к большому количеству ошибок в выводе (но не приводит к сбою команды):

> fsevents@1.2.11 install C:\test\node_modules\@angular\compiler-cli\node_modules\fsevents
> node-gyp rebuild


C:\test\node_modules\@angular\compiler-cli\node_modules\fsevents>if not defined npm_config_node_gyp (node "C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  else (node "C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" rebuild )
gyp ERR! find Python
gyp ERR! find Python Python is not set from command line or npm configuration
gyp ERR! find Python Python is not set from environment variable PYTHON
gyp ERR! find Python checking if "python" can be used
gyp ERR! find Python - "python" is not in PATH or produced an error
gyp ERR! find Python checking if "python2" can be used
gyp ERR! find Python - "python2" is not in PATH or produced an error
gyp ERR! find Python checking if "python3" can be used
gyp ERR! find Python - "python3" is not in PATH or produced an error
gyp ERR! find Python checking if the py launcher can be used to find Python 2
gyp ERR! find Python - "py.exe" is not in PATH or produced an error
gyp ERR! find Python checking if Python is C:\Python27\python.exe
gyp ERR! find Python - "C:\Python27\python.exe" could not be run
gyp ERR! find Python checking if Python is C:\Python37\python.exe
gyp ERR! find Python - "C:\Python37\python.exe" could not be run
gyp ERR! find Python
gyp ERR! find Python **********************************************************
gyp ERR! find Python You need to install the latest version of Python.
gyp ERR! find Python Node-gyp should be able to find and use Python. If not,
gyp ERR! find Python you can try one of the following options:
gyp ERR! find Python - Use the switch --python="C:\Path\To\python.exe"
gyp ERR! find Python   (accepted by both node-gyp and npm)
gyp ERR! find Python - Set the environment variable PYTHON
gyp ERR! find Python - Set the npm configuration variable python:
gyp ERR! find Python   npm config set python "C:\Path\To\python.exe"
gyp ERR! find Python For more information consult the documentation at:
gyp ERR! find Python https://github.com/nodejs/node-gyp#installation
gyp ERR! find Python **********************************************************
gyp ERR! find Python
gyp ERR! configure error
gyp ERR! stack Error: Could not find any Python installation to use
gyp ERR! stack     at PythonFinder.fail (C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\node-gyp\lib\find-python.js:307:47)
gyp ERR! stack     at PythonFinder.runChecks (C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\node-gyp\lib\find-python.js:136:21)
gyp ERR! stack     at PythonFinder.<anonymous> (C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\node-gyp\lib\find-python.js:225:16)
gyp ERR! stack     at PythonFinder.execFileCallback (C:\Users\foo\AppData\Roaming\nvm\v12.14.1\node_modules\npm\node_modules\node-gyp\lib\find-python.js:271:16)
gyp ERR! stack     at exithandler (child_process.js:302:5)
gyp ERR! stack     at ChildProcess.errorhandler (child_process.js:314:5)
gyp ERR! stack     at ChildProcess.emit (events.js:223:5)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:270:12)
gyp ERR! stack     at onErrorNT (internal/child_process.js:456:16)
gyp ERR! stack     at processTicksAndRejections (internal/process/task_queues.js:81:21)
gyp ERR! System Windows_NT 10.0.18362
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\foo\\AppData\\Roaming\\nvm\\v12.14.1\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\foo\repos\POC\angular\test1\node_modules\@angular\compiler-cli\node_modules\fsevents
gyp ERR! node -v v12.14.1
gyp ERR! node-gyp -v v5.0.5
gyp ERR!

Все ошибки связаны с тем fsevents, что node-gypисполняемый файл Python не найден. Это верно, у меня не установлен Python, но это не является обязательным условием для angular.

Команда на самом деле завершается с кодом 0 (указывая на успех - кроме того, ng build --prodработает после этого!), Но в выводе наверняка много ошибок.

Удаление node_modulesпапки вручную и запуск npm installвместо npm ciнее приводит к выводу, который намного короче и без ошибок. Кроме того, он не изменяет package-lock.jsonфайл, который указывает, что установлены одинаковые версии зависимостей.

Что здесь происходит? Почему так много ошибок при использовании, npm ciно нет при использовании npm install?

Максим Россини
источник

Ответы:

23

Кажется, ошибка связана с этой проблемой и этой проблемой .

Angular косвенно зависит от fsevents1.2.11, который не должен компилироваться в Windows (это модуль, связанный с darwin-OS). npm ciпрослушивается и игнорирует osполе в модуле package.json, поэтому он все равно пытается скомпилировать модуль, что не удается в Windows.

Ошибка не возникала в предыдущих угловых версиях, поскольку fsevents1.2.9 напрямую загружал двоичные файлы из AWS, а не компилировал их. Но из-за потери доступа от разработчиков к корзине AWS, что привело к невозможности установки модуля на узле 13, они выпустили исправление 1.2.11, чтобы позволить пользователям узла 13 установить пакет.

До тех пор, пока не npm ciбудет исправлено и / или fseventsне обновлено до 2.x в угловой версии, обходные пути в Windows:

  • Просто игнорируйте ошибку. npm ciзавершает работу с кодом 0, потому что зависимость необязательна, поэтому она не должна блокировать ваш сценарий развертывания (просто немного замедлите его и сделайте более подробным). Наименее плохой вариант на мой взгляд ...
  • Используйте npm installвместо npm ci, который будет правильно обрабатывать osполе fseventsфайла зависимостей. Но это потенциально обновит ваши зависимости, поэтому оно не очень подходит для сценариев CI, так как может изменять версионные файлы и не дает повторяемого вывода.
  • Зафиксируйте fseventsверсию модуля на 1.2.9 вместо 1.2.11 в вашем файле зависимостей, чтобы npm ciзагружать двоичные файлы вместо их компиляции. Это не будет работать при использовании узла 13, так как для этой версии узла нет загружаемых файлов. Кроме того, я не мог найти, как нужно обновить package.jsonфайл, чтобы сделать это ( это не работало для меня).
  • Использование npm ci --no-optional. К сожалению, это не работает, из-за еще одной ошибки в npm ci.
Максим Россини
источник
2
Фантастическая детективная работа; очень больно за последние несколько месяцев.
Максимилиан Бурзли
1
Спасибо тебе за это! Эта проблема все еще существует с угловым 9, если кому-то интересно.
ForestG
Откат к Node 10.x работал на меня
ps2goat