lerna是一款npm多包管理工具,可以在一个项目下,管理多个子项目,并自动维护各个子项目间的依赖关系,自动发包到npm。

# 简介

lerna采用的是monorepo模式,那么什么是monorepo模式呢?

在之前开发大型项目的时候,我们可能会自己开发一些子项目,或这工具库,作为依赖,而且每个库会在git上创建一个reporsitory,并且单独发包到npm;这样会造成的问题就是,每次一个库的更新,都要重新发包,并且依赖于这个库的其他项目,都需要去修改版本号,然后再手动发包比较繁琐,这就是所谓的multrepo模式。
monorepo模式,是将所有的模块或库,放在一个主项目中管理,我们只需要创建一个reporsitorylerna管理下的文件结构如下:

.
├── lerna.json
├── package.json
└── packages
    ├── a
    │   ├── index.js
    │   └── package.json
    ├── b
    │   ├── index.js
    │   └── package.json
    └── c
        ├── index.js
        └── package.json

# 安装使用

npm install lerna -g

初始化一个项目

mkdir demo
cd demo
lerna init

初始化后生成文件结构如下

.
├── lerna.json # 配置文件
├── package.json
└── packages # 包模块目录

# lerna模式

# 固定模式

通过lerna.json的版本进行版本管理。当你执行lerna publish命令时, 会自动修改更新了的模块库版本号,并自动修改依赖了此库的所有库的版本号。

# 独立模式

独立模式,init的时候需要设置选项 --independent. 独立模式在发布的时候需要手动指定每个库的版本号。这种情况下, lerna.json的版本号不会变化了, 默认为independent。

# lerna.json配置解析

{
  "version": "independent",
  "npmClient": "yarn",
  "command": {
    "publish": {
      "ignoreChanges": [
        "ignored-file",
        "*.md"
      ]
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]      
    }
  },
  "packages": ["packages/*"]
}
字段 描述
version 版本号,独立模式为independent
npmClient 安装包使用的命令,默认为npm
command 执行命令配置
packages 指定包目录

# 常用命令

安装包的所有依赖,类似于npm install

lerna bootstrap

将远程包作为依赖添加到包管理中

lerna add

发布包

lerna publish

注意 发布包时,需要先git commit代码后执行