npm ci在Windows上输出角度8和节点12的错误:node-gyp重建


12

我的设置:

  • Windows 10
  • 适用于Windows的NVM 1.1.7
  • 带有npm 6.13.4的节点12.14.1
  • 角8.2.14和@ angular / cli 8.3.22

只是尝试运行默认的角度模板:

> 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

最后一个命令在输出中导致很多错误(但不会使命令失败):

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

所有错误均与相关fseventsnode-gyp并且未找到python可执行文件。没错,我没有安装python,但这不是angular的先决条件。

该命令实际上以0代码退出(表示成功-除此之外,ng build --prod之后还可以工作!),但是输出中肯定有很多错误。

node_modules手动删除该文件夹并运行npm install而不是运行npm ci它会产生一个短得多且没有任何错误的输出。此外,它不会修改package-lock.json文件,这表示安装了相同版本的依赖项。

到底是怎么回事?为什么使用npm ci时有这么多错误,而使用时却没有npm install

Answers:


23

该bug似乎与此问题此问题有关

Angular间接依赖于fsevents1.2.11,它不应该在Windows上编译(这是与darwin-OS相关的模块)。npm ci已被修正并忽略os模块的字段package.json,因此无论如何它都会尝试编译模块,这在Windows上失败。

在以前的角度版本中未发生此错误,因为fsevents1.2.9是直接从AWS下载二进制文件,而不是对其进行编译。但是由于开发人员无法访问AWS存储桶,从而导致无法在节点13上安装模块,他们发布了1.2.11补丁程序以允许节点13的用户安装软件包。

npm ci修复和/或fsevents更新为2.x之前,Windows上的解决方法是:

  • 只需忽略该错误即可。npm ci退出代码0,因为该依赖关系是可选的,因此它不应阻止您的部署脚本(将其放慢一点,使其更冗长)。我认为最糟糕的选择是...
  • 使用npm install代替npm ci,它将正确处理依赖项文件的os字段fsevents。但这可能会更新您的依赖关系,因此它实际上不适合CI脚本,因为它可以更改版本化的文件,并且不会产生可重复的输出。
  • fsevents在依赖文件中将模块版本锁定为1.2.9而不是1.2.11,以便npm ci下载二进制文件而不是编译它们。使用节点13时,此操作将无效,因为此版本的节点没有二进制文件可供下载。另外,我找不到应该如何更新package.json文件的方式(对我不起作用)。
  • 使用npm ci --no-optional。不幸的是,由于中的另一个错误,此方法不起作用npm ci

2
出色的侦探工作;在过去的几个月中非常痛苦。
Maximilian Burszley

1
这次真是万分感谢!如果有人想知道,角度9仍然存在此问题。
ForestG

回滚到Node 10.x对我
有用
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.