lerna多包管理

80 阅读3分钟

前言

在我们自己编写npm包的时候,要是东西比较多的话,我们通常会将一个包拆为几个包,然后再相互依赖,比如先写一个基础包,然后再写一个中级的包,在中级包中使用基础包,不论是在中级包中使用基础包的方法,还是在中级包中对基础包进行扩展都是可以的。

Lerna

官方的说法是, 将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。

为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化

简单的来说就是lerna用来解决多包管理的麻烦和包之间的相互依赖问题。

安装

npm install --global lerna

创建一个git仓库

git init ceshi && cd ceshi

将git仓库转变为一个 Lerna 仓库:

分为两种模式 固定模式(默认) 和 独立模式

在转变成一个Lerna仓库后目录结构会像这样,packages文件夹中就是用来放置一个一个的包。

image.png

固定模式

lerna init

固定模式通过lerna.json里的版本进行统一的版本管理。这种模式自动将所有packages包版本捆绑在一起,对任何其中一个或者多个packages进行重大改动都会导致所有packages的版本号进行升级。

image.png

独立模式

lerna init --independent

这种模式允许使用者对每个package单独改变版本号。每次执行lerna publish的时候,针对所有有更新的package,会逐个询问需要升级的版本号,基准版本为它自身的package.json里面的版本号。 这种情况下,lerna.json的版本号不会变化, 默认为independent

lerna.json

image.png

使用(以独立模式为例)

在我们Lerna 仓库创建完之后就可以进行包的创建 创建一个基础包和一个中级包

lerna create basic && lerna create middle

可以看包packages中有两个文件夹basic和middle,对应的就是两个包。

image.png

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还有一些很实用的命令,命令之间也有不用的模式,详细的可以去看看官网