npm ci génère des erreurs avec angular 8 et node 12 sous Windows: reconstruction de node-gyp

12

Ma configuration:

  • Windows 10
  • NVM 1.1.7 pour Windows
  • noeud 12.14.1 avec npm 6.13.4
  • Angular 8.2.14 avec @ angular / cli 8.3.22

J'essaie simplement d'exécuter le modèle angulaire par défaut:

> 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

La dernière commande entraîne de nombreuses erreurs dans la sortie (mais n'échoue pas la commande):

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

Toutes les erreurs sont liées à fsevents, node-gypet exécutable python ne pas être trouvé. C'est vrai, je n'ai pas python installé, mais ce n'est pas une condition préalable pour angular.

La commande se termine en fait avec un code 0 (indiquant le succès - en plus, ng build --prodfonctionne après ça!) Mais il y a sûrement beaucoup d'erreurs dans la sortie.

La suppression node_modulesmanuelle du dossier et son exécution npm installau lieu de npm ciproduisent une sortie beaucoup plus courte et sans aucune erreur. En outre, il ne modifie pas le package-lock.jsonfichier, ce qui indique que les mêmes versions des dépendances sont installées.

Que se passe-t-il? Pourquoi tant d'erreurs lors de l'utilisation npm cimais aucune lors de l'utilisation npm install?

Maxime Rossini
la source

Réponses:

23

Il semble que le bogue soit lié à ce problème et à ce problème .

Angular dépend indirectement de fsevents1.2.11, qui n'est pas censé être compilé sur Windows (c'est un module lié à Darwin-OS). npm ciest buggé et ignore le oschamp dans le module package.json, il essaie quand même de compiler le module, ce qui échoue sous Windows.

L'erreur ne s'est pas produite dans les versions angulaires précédentes, car fsevents1.2.9 téléchargeait directement les fichiers binaires depuis AWS au lieu de les compiler. Mais en raison d'une perte d'accès des développeurs au compartiment AWS, entraînant l'impossibilité d'installer le module sur le nœud 13, ils ont publié le correctif 1.2.11 pour permettre aux utilisateurs du nœud 13 d'installer le package.

Jusqu'à ce qu'il npm cisoit corrigé et / ou fseventsmis à jour à 2.x en angulaire, les solutions de contournement sous Windows sont soit:

  • Ignorez simplement l'erreur. npm ciquitte le code 0 car la dépendance est facultative, elle ne doit donc pas bloquer votre script de déploiement (il suffit de le ralentir un peu et de le rendre plus détaillé). La moins mauvaise option à mon avis ...
  • Utilisez npm installau lieu de npm ci, qui traitera correctement le oschamp du fseventsfichier de dépendances. Mais cela mettra potentiellement à jour vos dépendances, il n'est donc pas vraiment adapté aux scripts CI, car il peut modifier les fichiers versionnés et ne produit pas de sortie répétable.
  • Verrouillez la fseventsversion du module sur 1.2.9 au lieu de 1.2.11 dans votre fichier de dépendances, afin de npm citélécharger les binaires au lieu de les compiler. Cela ne fonctionnera pas lors de l'utilisation du nœud 13, car il n'y a pas de fichiers binaires à télécharger pour cette version du nœud. De plus, je n'ai pas pu trouver comment mettre à jour le package.jsonfichier pour ce faire ( cela n'a pas fonctionné pour moi).
  • Utilisez npm ci --no-optional. Malheureusement, cela ne fonctionne pas, en raison d' un autre bug dans npm ci.
Maxime Rossini
la source
2
Fantastique travail de détective; très douloureux depuis plusieurs mois.
Maximilian Burszley
1
Merci pour ça! Ce problème existe toujours avec angulaire 9, si quelqu'un se le demande.
ForestG
Revenir au Node 10.x a fonctionné pour moi
ps2goat