npm ci genera errores con angular 8 y nodo 12 en Windows: reconstrucción de nodo-gyp

12

Mi configuración:

  • Windows 10
  • NVM 1.1.7 para Windows
  • nodo 12.14.1 con npm 6.13.4
  • Angular 8.2.14 con @ angular / cli 8.3.22

Solo intento ejecutar la plantilla angular predeterminada:

> 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

El último comando produce muchos errores en la salida (pero no falla el comando):

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

Todos los errores están relacionados con fsevents, node-gypy ejecutable de Python no se encontraron. Así es, no tengo Python instalado, pero no es un requisito previo para angular.

El comando en realidad sale con un código 0 (que indica éxito, además, ¡ ng build --prodfunciona después de eso!), Pero seguramente hay muchos errores en la salida.

Eliminar la node_modulescarpeta manualmente y ejecutarla en npm installlugar de npm ciproducir una salida que es mucho más corta y sin ningún error. Además, no modifica el package-lock.jsonarchivo, lo que indica que están instaladas las mismas versiones de las dependencias.

Que esta pasando? ¿Por qué tantos errores al usar npm cipero ninguno al usar npm install?

Maxime Rossini
fuente

Respuestas:

23

Parece que el error está relacionado con este problema y este problema .

Angular depende indirectamente de fsevents1.2.11, que no debe compilarse en Windows (es un módulo relacionado con darwin-OS). npm ciestá molesto e ignora el oscampo en el módulo package.json, por lo que intenta compilar el módulo de todos modos, lo que falla en Windows.

El error no se produjo en versiones angulares anteriores porque fsevents1.2.9 estaba descargando directamente archivos binarios de AWS en lugar de compilarlos. Pero debido a la pérdida de acceso de los desarrolladores al depósito de AWS, lo que llevó a la imposibilidad de instalar el módulo en el nodo 13, lanzaron el parche 1.2.11 para permitir que los usuarios del nodo 13 instalen el paquete.

Hasta que npm cise arregle y / o fseventsse actualice a 2.x en angular, las soluciones en Windows son:

  • Solo ignora el error. npm cisale con el código 0 porque la dependencia es opcional, por lo que no debería bloquear el script de implementación (solo frenarlo un poco y hacerlo más detallado). La opción menos mala en mi opinión ...
  • Use en npm installlugar de npm ci, que procesará correctamente el oscampo del fseventsarchivo de dependencias. Pero esto potencialmente actualizará sus dependencias, por lo que no es realmente adecuado para scripts de CI, ya que puede cambiar archivos versionados y no produce una salida repetible.
  • Bloquee la fseventsversión del módulo en 1.2.9 en lugar de 1.2.11 en su archivo de dependencias, de modo que npm cidescargue los archivos binarios en lugar de compilarlos. Esto no funcionará cuando use el nodo 13, ya que no hay binarios para descargar para esta versión del nodo. Además, no pude encontrar cómo se debe actualizar el package.jsonarchivo para hacer eso ( esto no funcionó para mí).
  • Uso npm ci --no-optional. Desafortunadamente esto no funciona, debido a otro error en npm ci.
Maxime Rossini
fuente
2
Fantástico trabajo de detective; Muy doloroso durante los últimos meses.
Maximilian Burszley
1
¡gracias por esto! Este problema todavía existe con angular 9, si alguien se pregunta.
ForestG
Volver al Nodo 10.x funcionó para mí
ps2goat