M1芯片Mac升级RN 0.71.0后pod install因hermes-engine失败
解决React Native 0.71.0在M1/M2 Mac上pod install时hermes-engine的Ruby兼容性问题
问题概述
基于React Native 0.70.6开发的项目升级到0.71.0后,M2芯片Mac可正常执行pod install,但M1芯片Mac及M1 Mac Mini执行该命令时失败,报错如下:
[!] Failed to load 'hermes-engine' podspec:
[!] Invalidhermes-engine.podspecfile: undefined method 'exists?' for FileClass.
报错指向/Users/<user>/projects/<app_dir>/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec第46行的File.exists?(hermestag_file) && isInCI代码,原因是Ruby 3.2.0中File.exists?方法已被弃用,但相同环境下M2机器可正常运行。
环境信息
两台机器环境版本完全一致:
- Ruby 3.2.0
- CocoaPods 1.11.3
- bundler 2.4.1
- Node.js 18.13.0
- Xcode 14.2(含命令行工具)
已尝试的无效操作
- 删除Pods文件夹后重新执行
pod install - 删除
Podfile.lock、清理CocoaPods缓存并删除Pods后重新安装 - 删除
node_modules,执行npm cache clean --force && npm install后再执行npx pod-install - 执行
pod deintegrate后重新pod install(操作后项目损坏已回滚)
可行解决方案
方案1:临时修改hermes-engine.podspec并持久化补丁
Ruby 3.2.0中File.exists?是File.exist?的弃用别名,部分环境下可能未正确加载该别名,直接替换为官方推荐的方法即可:
- 打开项目中的
node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec文件 - 定位到第46行,将
File.exists?(hermestag_file) && isInCI修改为File.exist?(hermestag_file) && isInCI - 执行
pod install验证是否解决问题
为避免每次npm install后修改被覆盖,可使用patch-package持久化补丁:
- 安装依赖:
npm install patch-package --save-dev - 修改完podspec后执行:
npx patch-package react-native - 将生成的
patches文件夹提交到Git仓库,同事拉取代码后执行npm install会自动应用该补丁
方案2:降级Ruby版本到3.1.x
CocoaPods 1.11.3对Ruby 3.2.0的兼容性存在问题,降级到Ruby 3.1.x版本可彻底解决:
- 使用rbenv安装Ruby 3.1.4(若未安装rbenv,先执行
brew install rbenv):rbenv install 3.1.4 - 在项目根目录创建
.ruby-version文件,内容为:3.1.4 - 重启终端,执行
ruby -v确认版本已切换 - 重新执行
bundle install和pod install
方案3:通过Rosetta 2兼容模式执行pod install
利用Rosetta 2模拟x86_64环境,绕过Ruby版本兼容性问题:
- 打开终端,右键点击终端图标选择「显示简介」
- 勾选「使用Rosetta打开」,重启终端
- 在终端中执行
pod install
内容的提问来源于stack exchange,提问作者Gentry T.
相关产品推荐
相关产品推荐

