MultiRepo vs MonoRepo ,各有各的需求场景。我觉得使用 MonoRepo 必须考虑以下几点:
- 拆分出来的 package ,发布为单独的 npm 包,真的会被单独引用。即有真实的需求,不是为了拆分而拆分。
- 不要为了使用 MonoRepo 把所有模块都包含进来。如 vuex 就不能放在 vue3 的 MonoRepo 中,要单独拆分出去。即要搞清楚模块和项目的关系:包含关系,还是平行独立的关系。
使用 lerna init
可初始化项目。有两种模式:
- 固定模式,默认。即所有 package 都使用统一的版本号,lerna.json 中初始化
"version": "0.0.0"
。 - 独立模式,使用
lerna init --independent
初始化项目。各个 package 使用不同的版本号,lerna.json 中初始化"version": "independent"
。
如果是 git clone 下来的项目,可以通过 lerna bootstrap
来安装所有的依赖。
如果想把 npm 包都安装到 root 级别,可以使用 lerna bootstrap --hoist
,或者在 lerna.json 中配置 command.bootstrap.hoist: true
。
lerna create moduleName
创建一个模块,文件和目录可以自己调整。
lerna add xxx
可以安装 npm 包(可使用 --dev
参数),可以关联 package 。
参数 --scope=pkgName
--scope={pkgName1, pkgName2}
表示一个范围, 也可以用到所有 lerna 命令中,例如:
- 在所有 package 中安装 lodash
lerna add lodash
- 仅在 pkg1 中安装 lodash
lerna add lodash --scope=pkg1
- 将 pkg1 关联到 pkg2
lerna add pkg1 --scope=pkg2
lerna run xxx
即运行所有 package 的 npm run xxx
。常见的如 lerna run test
lerna run build
。
lerna run publish
会检查改动的 package 并升级版本,发布到 npm 。当然首先你需要登录 npm 。
发布的常见配置,可见 lerna.json
ignoreChanges
忽略哪些改动message
发布时的 commit 信息allowBranch
允许的分支
和 lerna 没关系,该怎么用就怎么用。
lerna exec ...
对各个模块执行命令,如 lerna exec echo 100
,可使用 --scope
参数
lerna clean
清理所有模块的 node_modules
其他参考 lerna 官网吧。
lerna 就这些内容,框架很简介,就是一个“批量操作”,没有发明新的东西。
其他的开发环境配置,例如 eslint、commit-lint、test、打包、ts、CI/CD …… 等这些,都和之前一样,不会因为有了 lerna 而带来新的改变。