# Lerna
提供了一种集中管理package的目录模式,提供了一套自动化管理程序。让开发者在根项目就可以全局掌控(基于npm scripts)
将多个子包放到一个大工程下,然后通过packages里管理它们。
注意: 这些子包的仓库只有一个,也就是这个大工程。
# 初始化lerna工程
lerna init
会创建一个最普通的lerna脚手架:
lerna-repo/
packages/
package.json
lerna.json
Lerna-debug.json // 存储错误日志
2
3
4
5
# 创建子包
会在packages下新建一个子包,供lerna统一管理。
lerna create pkg-name
# 导入子包
lerna package <path>
lerna会将指定路径的工程全部导入到packages下,并将所有的commit记录一并提交
注:这种形式下,子包的所在仓库依然是属于根目录工程下的
# 本地开发时,引用其他包
# lerna clean 清除所有子包的node_modules文件夹
# 注意
不要将子包设为private: true,否则它在lerna内的功能将受影响。
# 将子包间的依赖转为软链
软链优先级:.babelrc里的alias(Web) > lerna link
# 其它
在RN项目中,遇到软链失效时,可以参考:
# 软链后,提示Module not found: Can't resolve xxx
可能由于webpack 设置了 alias 导致(但显示的依然是alias的名字)。
webpack.alias -> 去子包里找不到
真身
// demo工程:
// webpack.config.js
resolve: {
alias: {
'react-native$': '@music/react-native-web-suffix',
'@music/rn-util$': '@music/rn-util-web',
'@music/mnb-rn$': '@music/mnb-music',
}
},
2
3
4
5
6
7
8
9
一旦 webpack 里设置 alias ,工程里遇到react-native。若react-native在子包里也有被引用到,就会先去 被引子包(-rn)里取找这个包(@music/react-native-web-suffix)
# 软链失效,先检查版本
若-core被-h5引用,但发现-h5内的-core并不是本地的,检查-core的版本是否和-h5的package-lock.json中对的上
# 提示 script 所用的包不存在
将 package-lock.son 删除,再 npm i

# lerna publish

解决:
nenpm whoami检查是否已登录;未登录则nenpm login;- 若已登录,可能与
~/.npmrc内的authToken无效有关: cat ~/.nenpmrc,将下面这行复制到~/.npmrc即可
//rnpm.hz.netease.com/:_authToken=xxx
- 若还是不行,重置
nenpm密码 (opens new window)后重试 第3步。
# watchman error
Watchman error: too many pending cache jobs. Make sure watchman is running for this project.
# module和main字段的优先级
# peerDependencies
# jest-haste-map: Haste module naming collision: react-native

添加metro.config.js的blacklist:
https://stackoverflow.com/questions/41813211/how-to-make-react-native-packager-ignore-certain-directories
# 所有lerna bootstrap 会导致

# 重装watchman,发生homebrew报错
cd /usr/local/Homebrew/Library/Taps/homebrew
rm -rf homebrew-core
brew upgrade
2
3
使用brew upgrade后会重新更新homebrew-core
# 使用sdp发布时,lerna接收参数前需进行转换
"build:demo:web": "lerna run --scope @music/rpc-audio-rn build:web -- -- ",
https://github.com/lerna/lerna/issues/1106
有