npm ci wyświetla błędy z kątowym 8 i węzłem 12 w systemie Windows: przebudowa węzła-gyp

12

Moja konfiguracja:

  • Windows 10
  • NVM 1.1.7 dla Windows
  • węzeł 12.14.1 z npm 6.13.4
  • Kątowy 8.2.14 z @ kątowy / cli 8.3.22

Próbuję uruchomić domyślny szablon kątowy:

> 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

Ostatnie polecenie powoduje wiele błędów w danych wyjściowych (ale nie powoduje niepowodzenia polecenia):

> 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!

Wszystkie błędy są związane fsevents, node-gypa nie znajdowane pyton wykonywalny. Zgadza się, nie mam zainstalowanego Pythona, ale nie jest to konieczne dla Angulara.

Komenda faktycznie kończy działanie z kodem 0 (co oznacza sukces - poza tym ng build --proddziała później!), Ale na pewno jest wiele błędów w danych wyjściowych.

node_modulesRęczne usunięcie folderu i uruchomienie npm installzamiast tworzenia npm cipowoduje, że dane wyjściowe są znacznie krótsze i nie zawierają błędów. Ponadto nie modyfikuje package-lock.jsonpliku, co wskazuje, że zainstalowane są te same wersje zależności.

Co się dzieje? Po co tyle błędów podczas używania, npm ciale żadnych podczas używania npm install?

Maxime Rossini
źródło

Odpowiedzi:

23

Wygląda na to, że błąd związany jest z tym problemem i tym problemem .

Angular pośrednio zależy od wersji fsevents1.2.11, która nie powinna być kompilowana w systemie Windows (jest to moduł związany z Darwin-OS). npm cijest uszkodzony i ignoruje ospole w module package.json, więc i tak próbuje skompilować moduł, co nie powiedzie się w systemie Windows.

Błąd nie występował w poprzednich wersjach kątowych, ponieważ fsevents1.2.9 bezpośrednio pobierał pliki binarne z AWS zamiast je kompilować. Ale z powodu utraty dostępu deweloperów do segmentu AWS, co prowadzi do niemożności zainstalowania modułu w węźle 13, wydali łatkę 1.2.11, aby umożliwić użytkownikom węzła 13 instalację pakietu.

Dopóki nie npm cizostanie naprawiony i / lub fseventszaktualizowany do 2.x pod kątem, obejścia w systemie Windows są albo:

  • Po prostu zignoruj ​​błąd. npm ciwychodzi z kodem 0, ponieważ zależność jest opcjonalna, więc nie powinna blokować skryptu wdrażania (wystarczy spowolnić go i uczynić bardziej gadatliwym). Moim zdaniem najmniej zła opcja ...
  • Użyj npm installzamiast npm ci, aby poprawnie przetworzyć plik ospola fseventszależności. Ale to potencjalnie zaktualizuje twoje zależności, więc nie jest tak naprawdę odpowiednie dla skryptów CI, ponieważ może zmieniać wersje plików i nie generuje powtarzalnych wyników.
  • Zablokuj fseventswersję modułu do wersji 1.2.9 zamiast 1.2.11 w pliku zależności, aby npm cipobierać pliki binarne zamiast kompilować je. To nie zadziała, gdy użyjesz węzła 13, ponieważ nie ma plików binarnych do pobrania dla tej wersji węzła. Ponadto nie mogłem znaleźć sposobu, w jaki należy zaktualizować package.jsonplik, aby to zrobić ( to nie działało dla mnie).
  • Zastosowanie npm ci --no-optional. Niestety to nie działa, ponieważ kolejny bug in npm ci.
Maxime Rossini
źródło
2
Fantastyczna praca detektywistyczna; bardzo bolesne przez ostatnie kilka miesięcy.
Maximilian Burszley
1
Dziękuję Ci za to! Ten problem nadal występuje w przypadku kąta 9, jeśli ktoś się zastanawia.
ForestG
Przywracanie do Node 10.x działało dla mnie
ps2goat