npm ci 在 Windows 上使用 Angular 8 和 Node 12 输出错误:node-gyp重建

Max*_*ini 14 node.js npm angular

我的设置:

  • Windows 10
  • 适用于 Windows 的 NVM 1.1.7
  • 节点 12.14.1 和 npm 6.13.4
  • Angular 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
Run Code Online (Sandbox Code Playgroud)

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

> 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!
Run Code Online (Sandbox Code Playgroud)

fsevents所有错误都与node-gyp未找到 python 可执行文件有关。没错,我没有安装Python,但这不是Angular的先决条件。

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

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

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

Max*_*ini 29

看来这个错误与这个问题这个问题有关。

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

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

npm ci在 Angular得到修复和/或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认同)
  • 这次真是万分感谢!如果有人想知道的话,这个问题在 Angular 9 中仍然存在。 (2认同)