React Native Expo项目node-gyp与Python3.12兼容问题求助
React Native Expo node-gyp Python版本冲突解决方案
针对Apple Silicon macOS Sonoma(14)、Node.js v18、node-gyp 8环境下,Python3.10(node-gyp需求)与Python3.12(Android构建需求)的冲突问题,提供以下几种可行方案:
方案一:用pyenv管理多版本Python(推荐)
- 安装pyenv:
brew install pyenv - 安装Python3.10.x(替换x为最新小版本,如3.10.13):
pyenv install 3.10.13 - 在项目根目录创建
.python-version文件,写入3.10.13,进入项目目录时自动切换到该版本 - 执行
npm install安装依赖,此时node-gyp会使用Python3.10,解决snappy、node-sass等包的编译报错 - 进行Android构建时,可临时切换到Python3.12:
- 全局切换:
pyenv global 3.12.x(构建完成后再切回项目版本:pyenv local 3.10.13) - 或在构建命令前指定Python路径:
PYTHON=/usr/bin/python3.12 ./gradlew assembleDebug
- 全局切换:
方案二:升级node-gyp到支持Python3.12的版本
node-gyp 9.0及以上版本已支持Python3.12,可通过以下方式升级:
- 升级npm(npm内置node-gyp):
npm install -g npm@latest - 或单独升级项目依赖的node-gyp:
npm install node-gyp@latest --save-dev - 清理旧依赖后重新安装:
rm -rf node_modules package-lock.json && npm install - 额外提示:node-sass已废弃,建议替换为
sass(dart-sass),它是纯JS实现,无需node-gyp编译,直接修改package.json中的依赖后重新安装即可
方案三:强制使用预编译二进制包避免编译
针对snappy这类支持预编译的包,优先下载适配Apple Silicon的二进制包:
- 安装prebuild-install:
npm install prebuild-install --save-dev - 清理npm缓存:
npm cache clean --force - 重新安装snappy时跳过编译:
npm install snappy --build-from-source=false
方案四:临时指定node-gyp使用的Python版本
无需切换全局Python,安装依赖时临时指定Python3.10:
- 单次安装:
npm install --python=/path/to/python3.10(替换为你的Python3.10实际路径,可通过pyenv which python3.10获取) - 或临时设置npm配置:
npm config set python /path/to/python3.10- 执行
npm install - 安装完成后改回默认:
npm config set python /path/to/python3.12
内容的提问来源于stack exchange,提问作者NicoleZ
相关产品推荐
相关产品推荐

