多包存储库管理工具Lerna概述(汇总)
现代项目的代码管理
现代项目管理代码主要有Multirepo
和Monorepo
两种方式:
Multirepo
是把项目不同模块拆分后,分别在不同的仓库中进行管理;Monorepo
是把项目不同模块拆分后,一起放在同一个项目中管理。
Monorepo
相比Multirepo
的优势是:
- 共享构建以及配置脚本等核心流程;
- 所有模块一同部署上线,不需要单独发包、测试;
- 便于在开发阶段修复Bug。
这是项目代码在组织上的不同哲学:一种倡导分而治之,一种倡导集中管理。究竟是把鸡蛋全部放在同一个篮子里,还是倡导多元化,这就要根据团队的风格以及面临的实际场景进行选型。
Babel 和 React 都是典型的 Monorepo,其 issues 和 pull requests 都集中到唯一的项目中,CHANGELOG 可以简单地从一份 commits 列表梳理出来。
将大型代码库拆分为独立的独立版本包对于代码共享非常有用,然而在许多存储库中进行更改是麻烦和难以跟踪的事情。为了解决这些(和许多其他)问题,一些项目将它们的代码库组织成多包存储库。像 Babel、React、Vue、Angular、Ember、Meteor、Jest 等等。
Lerna概述
Lerna 是一个优化使用 git 和 npm 管理多包存储库的工作流工具,用于管理具有多个包的 JavaScript 项目。
Lerna 中的主要命令如下:
lerna bootstrap
,用于 repo 中的依赖关系链接在一起;lerna publish
,用于简化发布软件包更新,运行该命令会执行如下的步骤: a. 运行lerna updated来决定哪一个包需要被publish b. 如果有必要,将会更新lerna.json中的version c. 将所有更新过的的包中的package.json的version字段更新 d. 将所有更新过的包中的依赖更新 e. 为新版本创建一个git commit或tag f. 将包publish到npm上 g. 同时,该命令也有许多的参数,例如–skip-git 将不会创建git commit或tag,–skip-npm将不会把包publish到npm上。lerna updated/lerna diff
, 检查对包是否发生过变更lerna ls
,显示packages下的各个package的versionlerna clean
, 清理node_moduleslerna run
运行npm script
,可以指定具体的package
Lerna最佳实践
为了能够使Lerna发挥最大的作用,根据这段时间使用Lerna 的经验,总结出一个最佳实践。下面是一些特性。
- 采用Independent模式
- 根据Git提交信息,自动生成changelog
- eslint规则检查
- prettier自动格式化代码
- 提交代码,代码检查hook
- 遵循semver版本规范