O npm ci gera erros com o angular 8 e o nó 12 no Windows: reconstrução do node-gyp

12

Minha configuração:

  • Windows 10
  • NVM 1.1.7 para Windows
  • nó 12.14.1 com npm 6.13.4
  • Angular 8.2.14 com @ angular / cli 8.3.22

Apenas tentando executar o modelo angular padrão:

> 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

O último comando resulta em muitos erros na saída (mas não falha no 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 os erros estão relacionados com fsevents, node-gype python executável não sendo encontrado. É isso mesmo, não tenho python instalado, mas não é um pré-requisito para o angular.

O comando realmente sai com um código 0 (indicando sucesso - além disso, ng build --prodfunciona depois disso!), Mas certamente há muitos erros na saída.

Excluir a node_modulespasta manualmente e em execução, em npm installvez de npm ciproduzir uma saída muito mais curta e sem erros. Além disso, ele não modifica o package-lock.jsonarquivo, o que indica que as mesmas versões das dependências estão instaladas.

O que está acontecendo? Por que tantos erros ao usar, npm cimas nenhum ao usar npm install?

Maxime Rossini
fonte

Respostas:

23

Parece que o bug está relacionado a esse problema e a esse problema .

Angular depende indiretamente do fsevents1.2.11, que não deve ser compilado no Windows (é um módulo relacionado ao sistema operacional darwin). npm ciestá com erros e ignora o oscampo no módulo package.json, portanto, ele tenta compilar o módulo de qualquer maneira, o que falha no Windows.

O erro não ocorreu nas versões angulares anteriores porque o fsevents1.2.9 estava baixando diretamente os binários da AWS em vez de compilá-los. Mas, devido à perda de acesso dos desenvolvedores ao bucket da AWS, levando à impossibilidade de instalar o módulo no nó 13, eles lançaram o patch 1.2.11 para permitir que os usuários do nó 13 instalem o pacote.

Até que npm ciseja corrigido e / ou fseventsatualizado para 2.x em ângulo, as soluções alternativas no Windows são:

  • Apenas ignore o erro. npm cisai do código wit 0 porque a dependência é opcional, portanto, não deve bloquear o script de implantação (apenas reduza a velocidade e torne-o mais detalhado). A opção menos ruim na minha opinião ...
  • Use em npm installvez de npm ci, que processará corretamente o oscampo do fseventsarquivo de dependências. Mas isso potencialmente atualizará suas dependências, portanto não é realmente adequado para scripts de IC, pois pode alterar arquivos com versão e não produz uma saída repetível.
  • Bloqueie a fseventsversão do módulo para 1.2.9 em vez de 1.2.11 no seu arquivo de dependências, para quenpm ci download dos binários em vez de compilá-los. Isso não funcionará ao usar o nó 13, pois não há binários para fazer o download desta versão do nó. Além disso, não consegui encontrar como atualizar o package.jsonarquivo para fazer isso ( isso não funcionou para mim).
  • Use npm ci --no-optional. Infelizmente isso não funciona, por causa de mais um bug no npm ci.
Maxime Rossini
fonte
2
Trabalho fantástico de detetive; muito doloroso nos últimos meses.
Maximilian Burszley 27/01
11
Obrigado por isso! Esse problema ainda existe com o angular 9, se alguém quiser saber.
ForestG 21/02
Reverter para o Nó 10.x funcionou para mim
ps2goat