Lerna

monorepo、lerna是什么

Menorepo是管理项目代码的一个方式,指在一个项目仓库(repo)中管理多个模块/包(package),不同于常见的每个模块建一个 repo.

Lerna是一种Monorepo的解决方案

优缺点

优点:

  1. 节约了大量存储空间
    • 比如多个项目都依赖Vue,Vue-route等包,在多个仓库的项目下,node_modules会出现大量的冗余。
  2. 调试方便
    • 在多个仓库的项目下,调试依赖的包是通过npm link,使用Lerna不需要了
  3. 资源包升级问题
    • 一个项目依赖了多个 npm 包,当某一个子 npm 包代码修改升级时,都要对主干项目包进行升级修改。(这个问题最烦,可能一个版本号就要去更新一下代码并发布)

缺点

  1. 由于源码在一起,仓库变更非常常见,存储空间也变得很大,甚至几G,CI 测试运行时间也会变长

使用方法

安装 lerna 工具

npm install lerna -g

初始化一个 lerna 项目

mkdir lerna-demo
cd lerna-demo
lerna init

生成如下文件:

- package(目录)
- lerna.json(配置文件)
- package.json(工程描述)

常见命令

lerna init // 初始化 lerna 项目
lerna create <name> // 创建一个新的由 lerna 管理的包
lerna bootstrap // 安装所有依赖项并连接所有的交叉依赖
lerna add axios // 增加模块包到最外层的公共 node_modules中
lerna add a --scope=b // 增加模块包到 packages 中指定项目 下面是将 a 模块增加到 b 项目中
lerna exec --scope a -- yarn start //在 packages 中对应包下的执行任意命令 下面的命令,是对 packages 下的 a 项目执行 yarn start 命令 ,比较常用,可以把它配置到最外层的 package.json 中
如果命令中不增加 --scope a 直接使用下面的命令,这会在 packages 下所有包执行命令rm -rf ./node_modules
lerna exec -- rm -rf ./node_modules
lerna list // 显示所有的安装的包。等同于 lerna ls
lerna clean // 从所有包中删除 node_modules 目录。不会删除项目最外层的根 node_modules
lerna publish // 在当前项目中发布包。lerna publish 永远不会发布标记为 private 的包(package.json中的”private“: true)