【问题标题】:npm ci outputs errors with angular 8 and node 12 on Windows: node-gyp rebuildnpm ci 在 Windows 上输出角度 8 和节点 12 的错误:node-gyp rebuild
【发布时间】:2020-04-28 07:25:09
【问题描述】:

我的设置:

  • 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

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

> 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时却没有?

【问题讨论】:

    标签: node.js angular npm


    【解决方案1】:

    该错误似乎与this issuethis issue 有关。

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

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

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

    • 忽略错误。 npm ci 以代码 0 退出,因为依赖项是可选的,所以它不应该阻止您的部署脚本(只是放慢一点,让它更冗长)。我认为最不坏的选择...
    • 使用npm install 而不是npm ci,这将正确处理fsevents 依赖文件的os 字段。但这可能会更新您的依赖项,因此它并不真正适合 CI 脚本,因为它可以更改版本控制的文件,并且不会产生可重复的输出。
    • 在依赖文件中将fsevents 模块版本锁定为1.2.9 而不是1.2.11,以便npm ci 下载二进制文件而不是编译它们。这在使用节点 13 时不起作用,因为没有为此版本的节点下载二进制文件。此外,我找不到应该如何更新 package.json 文件来做到这一点(this 对我不起作用)。
    • 使用npm ci --no-optional。不幸的是,这不起作用,因为npm ci 中的yet another bug

    【讨论】:

    • 出色的侦探作品;过去几个月非常痛苦。
    • 谢谢你!如果有人想知道,角度 9 仍然存在这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2012-08-12
    • 1970-01-01
    • 2023-03-18
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多