前言
Lerna是一个管理多个Node模块的工具,已经被很多著名模块使用:Babel,React,Jest等
Monorepo vs Multirepo
Monorepo的全称是monolithic repository,即为单体式仓库,与之对应的是Multirepo(multiple repository)。这里单
和多
是指每个仓库中所管理的模块数量
Multirepo是比较传统的做法,即每一个模块都单独用一个仓库来进行管理,典型是webpack,优缺点总结如下
优点:
- 各模块管理自由度较高,可自行选择构建工具,依赖管理,单元测试等配套设施
- 各模块仓库体积一般不会太大
缺点: - issue 管理混乱,在实际使用中会发现 core repo 中经常会出现对一些针对 module 提出的问题,需要做 issue 迁移或关联
- changlog 无法关联,无法很好的自动关联各个 module 与 core repo 之间的变动联系
- 版本更新繁琐,如果 core repo 的版本发生了变化,需要对所有的 module 进行依赖 core repo 的更新
- 测试复杂,对多个相关联 module 测试繁琐
Monorep 是把所有相关的 module 都放在一个仓库里进行管理,每个 module 独立发布,典型案例有 babel,优缺点总结如下:
优点:
- 管理简便,issue 和 PR 都放在一个仓库中进行维护
- changelog 维护简便,所有changelog 都基于同一份 commit 列表
- 版本更新简便,core repo 以及各模块版本发生变更后可以很简便的同步更新其余所有对其有依赖的 module
缺点: - 仓库体积增长迅速,随着 module 的增多,仓库的体积会变得十分庞大
- 自由度较低,高度的统一导致各个模块的自由度较低,且对统一的配套工具(构建,测试)等要求较高,要能适配各个 module 的要求
Lern可以帮我们做什么
lerna可以通过git和npm 来帮助我们优化管理Monorepo工作流,同时也可以减少开发和构建环境中对大量依赖包复制的时间和空间需求
一个基本的Lerna仓库结构如下:
lerna-demo
┣━ packages/
┃ ┣━ package-1/
┃ ┃ ┣━ ...
┃ ┃ ┗━ package.json
┃ ┗━ package-2/
┃ ┣━ ...
┃ ┗━ package.json
┣━ ...
┣━ lerna.json
┗━ package.json
lerna采用两种不同方式来管理项目:Fixed(默认)或者Independent
Fixed模式
固定模式下 Lerna 项目在单一版本线上运行。版本号保存在项目根目录下 lerna.json 文件中的 version 下。当你运行 lerna publish 时,如果一个模块自上次发布版本以后有更新,则它将更新到你将要发布的新版本。这意味着你在需要发布新版本时只需发布一个统一的版本即可。
Independent 模式(--independent)
独立模式下 Lerna 允许维护人员独立地的迭代各个包版本。每次发布时,你都会收到每个发生更改的包的提示,同时来指定它是 patch,minor,major 还是自定义类型的迭代。
创建模块
create
lerna create module-a
创建完之后可以看到目录结构
lerna-demo/
┣━ packages/
┃ ┗━ module-a/
┃ ┣━ ...
┃ ┗━ package.json
┣━ lerna.json
┗━ package.json
查看模块列表
创建完毕之后,我们可以通过 list 命令来查看和确认现在管理的包是否符合我们的预期,执行如下命令:
lerna list
添加依赖包
在lerna项目中,可以分别给每个模块单独添加依赖包,也可以同时给部分或全部模块添加依赖包,还可以把管理的某些模块作为依赖添加给其他模块。
// 给module-a模块添加 lodash依赖
lerna add lodash --scope module-a
// 给module-b模块添加 lodash依赖,并作为 devDependencies
lerna add lodash --scope module-b --dev
// 在所有模块里安装 word-wrap 依赖
lerna add moment
安装依赖包
lerna 通过 bootstrap 命令来快速安装所有模块所需的依赖包。基本命令如下:
lerna bootstrap
refer
http://www.uedlinker.com/2018/08/17/lerna-trainning/#%E4%BB%80%E4%B9%88%E6%98%AF-lerna
网友评论