前言
在我们自己编写npm包的时候,要是东西比较多的话,我们通常会将一个包拆为几个包,然后再相互依赖,比如先写一个基础包,然后再写一个中级的包,在中级包中使用基础包,不论是在中级包中使用基础包的方法,还是在中级包中对基础包进行扩展都是可以的。
Lerna
官方的说法是, 将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。
为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化
简单的来说就是lerna用来解决多包管理的麻烦和包之间的相互依赖问题。
安装
npm install --global lerna
创建一个git仓库
git init ceshi && cd ceshi
将git仓库转变为一个 Lerna 仓库:
分为两种模式 固定模式
(默认) 和 独立模式
在转变成一个Lerna仓库后目录结构会像这样,packages文件夹中就是用来放置一个一个的包。
固定模式
lerna init
固定模式通过lerna.json
里的版本进行统一的版本管理。这种模式自动将所有packages包版本捆绑在一起,对任何其中一个或者多个packages进行重大改动都会导致所有packages的版本号进行升级。
独立模式
lerna init --independent
这种模式允许使用者对每个package单独改变版本号。每次执行lerna publish
的时候,针对所有有更新的package,会逐个询问需要升级的版本号,基准版本为它自身的package.json里面的版本号。
这种情况下,lerna.json
的版本号不会变化, 默认为independent
。
lerna.json
使用(以独立模式为例)
在我们Lerna 仓库创建完之后就可以进行包的创建 创建一个基础包和一个中级包
lerna create basic && lerna create middle
可以看包packages中有两个文件夹basic和middle,对应的就是两个包。
basic
在packages/basic/lib/basic.js
添加代码:
function add(a, b) {
return a + b;
}
module.exports = { add };
middle
我们构造middle依赖于basic,这样middle包中就有了basic包
lerna add basic --scope=middle
在packages/middle/lib/middle.js
添加代码:
const { add } = require('basic');
function min(a, b) {
return Math.min(a, b);
}
module.exports = { min, add };
发送到npm
在middle包更新时,basic没有更新,那么命令会更新middle包的版本和发布
在basic包更新时,basic和middle都会更新版本,因为middle依赖于basic
lerna publish
结语
lerna还有一些很实用的命令,命令之间也有不用的模式,详细的可以去看看官网