什么是Lernajs?
lernaJs是由Babel团队出的一个多包管理工具。因为Babel包含很多子包,以前都是放在多个仓库里的,管理比较困难,特别是有调用系统内包的时候,发布比较麻烦。所以为了能更好更快的夸包管理,babel推出了lernaJs,使用了monorepo的概念,现在React,Babel,Angular,Jest都在使用这个工具来管理包。
什么是monorepo?
monorepo是比较于multi-package的。multi-package就是建立多个仓库,每个包建立一个仓库。而monorepo是建立一个仓库,多个包都在这个仓库中管理,这样可以有两个好处
- 各个包之间的沟通更加的方便,如果multi-package的话,系统内其中一个包修改,需要单独发版,而且引用这个包的其他包都需要发版。使用lerna的话可以自动管理这些包的发版,很方便.
- 一些可以共用的配置,比如eslint,babel,rollup等,可以统一的管理这些开发配置
快速开始
安装和初始化项目
安装lernajs
npm install lerna -g or yarn global add lerna
初始化lerna项目
lerna init
执行后,会自动生成一个由lerna管理的monorepo。 其文件结构如下:
lerna-repo/
packages/ // 子包都放在这个目录中
package.json
lerna.json // lerna js的配置文件
添加子包
环境初始好以后,首先需要添加一个子包,添加子包的命令如下:
lerna create <pkgName>
执行这个命令后,会问一些包名啊,版本等问题和执行npm init后问的差不多,填完这些问题后包就会自动创建一个子包。 子包默认的目录结构如下:
<packName>
__tests__ // 测试文件
lib // 包的入口文件默认在这个目录下
package.json
README.md
怎么给子包添加依赖
添加依赖的命令是:
lerna add <moduleName> // 所有子包都添加这个依赖
lerna add <moduleName> --scope = <pkgName> // 给scope后的包添加依赖
lerna add <pkgName1> --scope = <pkgName2> // 给pkgName2中添加pkgName1,包内的互相引用,会复制pkgName1到pkgName2中
所有子包更新依赖
lerna bootstrap
如何打包
打包针对于各自包内的打包插件配置,如果是js、或者组件的插件推荐使用rollup,这里不继续赘述。
如何发布
lerna publish
在lerna.json中可以设置版本号的规则
// lerna.json
"version": "0.0.3" // 如果是数字,就是所有子包都是这个版本。设置成‘independent’,独立管理每个包的版本
lernajs 会对比包的变化,自动发布需要发布的子包。
总结
这样我们就实现了多包的monorepo的结构,可以通过命令开发,打包,测试其中的每个子包。所有子包的eslint,babel,jest的配置都是一样的。可以方便的一个命令发版,一个命令更新和添加依赖。
最终文件结构
docs
|---README.md
packages
|---packageOne
|---packageTwo
.
.
.
script
|---build.js
|---test.js
.commitlintrc.js
.eslintignore
.eslintrc
.gitignore
babel.config.js
lerna.json
package.json
使用命令
关于包的命令
新建一个包:
lerna creat <packname>
发布
lerna publish
所有包更新node_modules
lerna bootstrap
A包中添加B包
lerna add <packageA> --scope <packageB>