React Native中pod install如何忽略链接库内部的node_modules
问题背景
我正在开发一款内部UI库,使用react-native-builder-bob运行很顺畅,我可以在example文件夹对应的示例应用中测试组件,专注于库的开发。
但当我将该库链接到my-app时(执行yarn link && cd ../my-app/ && yarn link my-lib),再运行pod install(cd ios && pod install),示例应用的依赖会被引入到my-app的podfile.lock中,如下所示:
EXSplashScreen: :path: "../node_modules/my-library/example/node_modules/expo-splash-screen/ios"
我不接受这类依赖成为项目的直接依赖,更无法接受它导致应用启动崩溃(我的应用并未使用expo,也没有调用任何expo相关能力。
请问我要如何同时在example项目和my-app中正常开发测试,且两者不会互相干扰?
已了解的备选方案
- 开发my-app时删除example的node_modules:但我不想采用该方案。
- 使用
yarn pack打包库,解压tar包后再链接(打包产物不会包含example文件夹):但该方案操作比较繁琐。 - 修改
Podfile对应的RN脚本忽略example文件夹:但我不知道具体实现方式,也不确定该方案是否适配安卓端。
补充说明:引入子文件夹依赖的是
react-native-unimodules的cocoapods.rb脚本,它会拉取所有包含unimodules.json的包。
可落地的解决方案
方案1:修改依赖查找逻辑(双端适配,不需要更换链接方式)
iOS端处理
在my-app的ios/Podfile中,调用use_unimodules!或use_native_modules!之前,添加如下代码过滤example路径的依赖:
# 过滤example路径下的所有依赖 require 'json' module Unimodules class PodspecFinder original_method = instance_method(:podspecs) define_method(:podspecs) do original_method.bind(self).call.reject { |podspec| podspec[:path].include?('/example/') || podspec[:path].include?('\\example\\') } end end end
如果是使用RN官方原生依赖查找逻辑,同理重写NativeModules::PackageMatcher的对应方法过滤example路径即可。
安卓端处理
在UI库根目录新建/修改react-native.config.js,添加如下配置忽略example下的所有依赖:
const exampleDeps = require('./example/package.json').dependencies || {} module.exports = { dependencies: Object.keys(exampleDeps).reduce((acc, dep) => { acc[dep] = { platforms: { android: null, ios: null, }, } return acc }, {}), assets: [], }
方案2:使用yalc替代yarn link(更简单,无需修改配置)
yalc会模拟真实的npm包发布安装逻辑,自动遵循库的.npmignore或package.json中files字段的配置,不会引入example文件夹内容。
操作步骤:
- 全局安装yalc:
npm i yalc -g - 在UI库的
package.json中添加files字段,仅声明需要发布的文件,示例:"files": ["src", "lib", "ios", "android", "package.json"] - UI库根目录执行
yalc publish - 在
my-app根目录执行yalc add my-lib完成链接
后续修改UI库代码后,执行yalc push即可自动同步变更到my-app,不会引入example的任何依赖。
内容的提问来源于stack exchange,提问作者Gabriel Rohden

