在使用yarn或者npm安装js包的过程中,常有需要使用node-gyp重新编译的情况,并且每次遇到这种情况,大多与python相关。我不是专业前端开发,所以对于node-gyp具体在node中扮演什么角色不是特别清楚,但是每次node-gyp编译出现问题都与python的版本相关。
node-gyp rebuild与Python3
这次我又遇到node-gyp需要重新编译,并且编译不通过。我的Mac电脑上安装了python2.7(系统默认安装)和python3.11(安装包手动安装)。在调用yarn命令时,需要重新编译node-gyp并默认使用python3.11。此时就出现了如下问题:
Command: node-gyp rebuild
Arguments:
Directory: /Volumes/data/documents/我/工作/electron-crawler/node_modules/fsevents
Output:
gyp info it worked if it ends with ok
gyp info using node-gyp@7.1.2
gyp info using node@16.10.0 | darwin | x64
gyp info find Python using Python version 3.11.0 found at \"/usr/local/bin/python3\"
(node:9902) [DEP0150] DeprecationWarning: Setting process.config is deprecated. In the future the property will be read-only.
(Use `node --trace-deprecation ...` to show where the warning was created)
gyp info spawn /usr/local/bin/python3
......
ValueError: invalid mode: 'rU' while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)
gyp ERR! stack at ChildProcess.emit (node:events:390:28)
gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:290:12)
gyp ERR! System Darwin 16.7.0
gyp ERR! command \"/usr/local/bin/node\" \"/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js\" \"rebuild\"
gyp ERR! cwd /Volumes/data/documents/我/工作/electron-crawler/node_modules/fsevents
gyp ERR! node -v v16.10.0
gyp ERR! node-gyp -v v7.1.2
gyp ERR! not ok"
通过在网络上的一顿操作,发现这次的问题又是与python版本相关。
最新python3.9已经不支持“U”这个标志位了,因此这次的主要原因是node版本太低(目前的最新版本是node@18,但是我安装的是node@16,主要是我的Mac是10.12.6,所以根本问题还是技术太菜Mac太旧)。因此在安装JS包的时候,确认NPM或者Yarn使用低版本的Python即可,目前网上搜了下有以下几种方法。
npm config set python python2.7
或者使用.npmrc配置
yarn config set python /usr/bin/python
扫码联系船长