使用Turborepo和Yarn Workspaces的React Native monorepo中Pods报错
报错原因
这个错误的核心是iOS Podfile执行post-install hook时,找不到指定路径下的react-native/package.json。在monorepo结构中,Yarn Workspaces会将依赖hoist到根目录的node_modules,但默认Podfile的相对路径是基于子项目目录(比如apps/your-app/ios)指向../node_modules,这和monorepo的实际依赖位置不匹配;另外Turborepo的缓存或Pod缓存也可能导致依赖路径异常。
解决方案
1. 修正Podfile中的React Native路径
打开iOS项目目录下的Podfile,调整所有指向react-native的相对路径,使其对应monorepo根目录的node_modules:
- 替换
require_relative '../node_modules/react-native/scripts/react_native_pods'为符合你项目层级的路径,比如你的项目结构是monorepo/apps/my-app/ios,则改为:require_relative '../../../node_modules/react-native/scripts/react_native_pods' - 同时修改Pod声明中的路径:
pod 'React', :path => '../../../node_modules/react-native' pod 'React-Core', :path => '../../../node_modules/react-native/React' # 其他React相关依赖的路径也需要同步调整
2. 配置Yarn Workspaces的Nohoist规则
如果部分React Native依赖无法被正常hoist,在monorepo根目录的package.json中添加nohoist配置,避免依赖被移动到根目录后路径失效:
"workspaces": { "packages": [ "apps/*", "packages/*" ], "nohoist": [ "**/react-native", "**/react-native/**", "**/@react-native-community/**", "**/@react-navigation/**" ] }
配置完成后,删除所有node_modules并重新安装依赖:
rm -rf node_modules apps/*/node_modules yarn install
3. 清理缓存并重新安装Pods
- 清理Turborepo缓存:
turbo clean - 进入iOS目录,清理Pod相关缓存:
cd apps/my-app/ios pod deintegrate && pod cache clean --all - 重新安装Pods:
pod install
4. 确保React Native安装在根目录
检查monorepo根目录的package.json是否包含react-native作为依赖(通常是devDependency),避免子项目单独安装导致路径混乱。如果根目录没有安装,执行:
yarn add react-native --dev -W
其他开发者的解决经验
不少遇到相同问题的开发者都是通过调整Podfile的相对路径解决的;还有部分人是因为Yarn hoisting导致符号链接在Pod环境中无法被识别,添加nohoist规则后解决;另外需要注意,执行pod install前必须确保根目录已经完成依赖安装,否则会出现路径缺失的问题。
内容的提问来源于stack exchange,提问作者Khalid Ahmada

