# Lerna

提供了一种集中管理package的目录模式,提供了一套自动化管理程序。让开发者在根项目就可以全局掌控(基于npm scripts

将多个子包放到一个大工程下,然后通过packages里管理它们。

注意: 这些子包的仓库只有一个,也就是这个大工程。

# 初始化lerna工程

lerna init
1

会创建一个最普通的lerna脚手架:

lerna-repo/
    packages/
    package.json
    lerna.json
    Lerna-debug.json // 存储错误日志
1
2
3
4
5

# 创建子包

会在packages下新建一个子包,供lerna统一管理。

lerna create pkg-name
1

# 导入子包

lerna package <path>
1

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',
    }
},
1
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的版本是否和-h5package-lock.json中对的上

# 提示 script 所用的包不存在

package-lock.son 删除,再 npm i

alt

# lerna publish

alt

解决:

  1. nenpm whoami检查是否已登录;未登录则nenpm login
  2. 若已登录,可能与~/.npmrc内的 authToken 无效有关:
  3. cat ~/.nenpmrc,将下面这行复制到 ~/.npmrc 即可
//rnpm.hz.netease.com/:_authToken=xxx
1
  1. 若还是不行,重置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

alt

添加metro.config.jsblacklist: https://stackoverflow.com/questions/41813211/how-to-make-react-native-packager-ignore-certain-directories

# 所有lerna bootstrap 会导致

alt

# 重装watchman,发生homebrew报错

cd /usr/local/Homebrew/Library/Taps/homebrew
rm -rf homebrew-core
brew upgrade
1
2
3

使用brew upgrade后会重新更新homebrew-core

# 使用sdp发布时,lerna接收参数前需进行转换

"build:demo:web": "lerna run --scope @music/rpc-audio-rn build:web -- -- ",
1

https://github.com/lerna/lerna/issues/1106

更新时间: 11/21/2021, 2:45:24 AM