node.js - npm ci 在 Windows : node-gyp rebuild 上输出 Angular 8 和 Node 12 的错误

标签 node.js angular npm

我的设置:

  • Windows 10
  • 适用于 Windows 的 NVM 1.1.7
  • Node 12.14.1 与 npm 6.13.4
  • Angular 8.2.14 与 @angular/cli 8.3.22

  • 只是尝试运行默认的 Angular 模板:

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

    最佳答案

    该错误似乎与 this issue 有关和 this issue .

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

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

    直到 npm ci得到修复和/或 fsevents在 Angular 更新到 2.x,Windows 上的解决方法是:

  • 只需忽略错误。 npm ci退出机智代码 0 因为依赖项是可选的,所以它不应该阻止你的部署脚本(只是放慢一点,让它更冗长)。我认为最不坏的选择...
  • 使用npm install而不是 npm ci ,它将正确处理 os fsevents 的字段依赖文件。但这可能会更新您的依赖项,因此它并不适合 CI 脚本,因为它可以更改版本控制的文件,并且不会产生可重复的输出。
  • 锁定fsevents在依赖文件中将模块版本改为 1.2.9 而不是 1.2.11,这样 npm ci下载二进制文件而不是编译它们。这在使用 Node 13 时不起作用,因为没有为此版本的 Node 下载二进制文件。另外,我找不到如何更新 package.json文件来做到这一点( this 对我不起作用)。
  • 使用npm ci --no-optional .不幸的是,这不起作用,因为 yet another bugnpm ci .
  • 关于node.js - npm ci 在 Windows : node-gyp rebuild 上输出 Angular 8 和 Node 12 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59685157/

    相关文章:

    node.js - 缓冲区不会打印到字符串

    javascript - ASP.NET MVC 和 Angular 4 mini SPA - 页脚问题

    javascript - 一个模态如何重新打开另一个模态? ( Angular 4+)

    javascript - 有哪些选项可用于定义具有 node.js 依赖项的 Python 包?

    node.js - 以html格式显示npm审计漏洞

    javascript - Node.js 执行 Javascript 文件

    javascript - 将 Controller 变量传递给 Express/Node.js 中的 View

    npm - 瓦丁 19 : Using NPM modules with own Vaadin dependencies fails

    javascript - 如何在xadesjs中签署文档?

    javascript - map、filter 与 for 和 forEach 之间的区别以及使用 map 和 filter 优于 For 和 forEach 循环的优势是什么?