npm ci menghasilkan kesalahan dengan sudut 8 dan simpul 12 pada Windows: simpul-gyp dibangun kembali

12

Pengaturan saya:

  • Windows 10
  • NVM 1.1.7 untuk Windows
  • simpul 12.14.1 dengan npm 6.13.4
  • Angular 8.2.14 dengan @ angular / cli 8.3.22

Hanya mencoba menjalankan template sudut default:

> 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

Perintah terakhir menghasilkan banyak kesalahan dalam output (tetapi tidak gagal perintah):

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

Semua kesalahan terkait dengan fsevents, node-gypdan dieksekusi python tidak ditemukan. Benar, saya tidak menginstal python, tapi itu bukan prasyarat untuk sudut.

Perintah sebenarnya keluar dengan kode 0 (menunjukkan keberhasilan - selain itu, ng build --prodberfungsi setelah itu!) Tetapi pasti ada banyak kesalahan dalam output.

Menghapus node_modulesfolder secara manual dan menjalankan npm installalih-alih npm cimenghasilkan output yang jauh lebih pendek dan tanpa kesalahan. Juga, itu tidak memodifikasi package-lock.jsonfile, yang menunjukkan bahwa versi dependensi yang sama diinstal.

Apa yang sedang terjadi? Mengapa begitu banyak kesalahan saat menggunakan npm citetapi tidak ada saat menggunakan npm install?

Maxime Rossini
sumber

Jawaban:

23

Tampaknya bug tersebut terkait dengan masalah ini dan masalah ini .

Sudut tidak langsung tergantung pada fsevents1.2.11, yang tidak seharusnya dikompilasi pada Windows (ini adalah modul terkait darwin-OS). npm cidisadap dan mengabaikan osbidang di modul package.json, jadi tetap mencoba mengkompilasi modul, yang gagal pada Windows.

Kesalahan tidak terjadi pada versi sudut sebelumnya karena fsevents1.2.9 secara langsung mengunduh binari dari AWS daripada mengkompilasinya. Tetapi karena hilangnya akses dari devs ke AWS bucket, yang menyebabkan ketidakmungkinan untuk menginstal modul pada node 13, mereka merilis patch 1.2.11 untuk memungkinkan pengguna node 13 untuk menginstal paket.

Sampai npm cidiperbaiki dan / atau fseventsdiperbarui ke 2.x di sudut, solusi di Windows adalah:

  • Abaikan saja kesalahannya. npm cikeluar dengan kode 0 karena dependensi bersifat opsional, sehingga tidak boleh memblokir skrip penerapan Anda (cukup memperlambatnya sedikit dan membuatnya lebih verbose). Pilihan paling buruk menurut saya ...
  • Gunakan npm installalih-alih npm ci, yang akan memproses dengan benar osbidang fseventsfile dependensi. Tetapi ini berpotensi memperbarui dependensi Anda, sehingga tidak benar-benar cocok untuk skrip CI, karena dapat mengubah file berversi, dan tidak menghasilkan output berulang.
  • Kunci fseventsversi modul ke 1.2.9 bukannya 1.2.11 di file dependensi Anda, sehingga npm ciunduh binari alih-alih kompilasi. Ini tidak akan berfungsi ketika menggunakan simpul 13, karena tidak ada binari untuk diunduh untuk versi simpul ini. Juga, saya tidak dapat menemukan bagaimana seseorang harus memperbarui package.jsonfile untuk melakukan itu ( ini tidak berhasil untuk saya).
  • Gunakan npm ci --no-optional. Sayangnya ini tidak berfungsi, karena ada bug lain di npm ci.
Maxime Rossini
sumber
2
Pekerjaan detektif yang fantastis; sangat menyakitkan selama beberapa bulan terakhir.
Maximilian Burszley
1
Terima kasih untuk ini! Masalah ini masih ada dengan sudut 9, jika ada yang bertanya-tanya.
ForestG
Bergulir kembali ke Node 10.x bekerja untuk saya
ps2goat