# 实战:管理多包项目

下面用一个简单案例演示 Lerna 在 Monorepo 中的典型使用。

# 目标

创建两个包:

  • @demo/utils:工具函数包
  • @demo/core:业务包,依赖 utils

# 初始化仓库

mkdir demo-monorepo && cd demo-monorepo
npm init -y
npm install -D lerna
npx lerna init
1
2
3
4

# 创建两个 package

npx lerna create @demo/utils
npx lerna create @demo/core
1
2

# 编写示例代码

packages/utils/index.js

exports.sum = (a, b) => a + b;
1

packages/core/index.js

const { sum } = require("@demo/utils");

exports.calc = () => sum(1, 2);
1
2
3

# 处理包间依赖

如果配合 workspace,通常在 @demo/core 中声明依赖后,安装时会自动软链到本地包。

{
  "dependencies": {
    "@demo/utils": "^1.0.0"
  }
}
1
2
3
4
5

# 批量执行脚本

给两个包都加上 build/test 脚本后,可在根目录统一执行:

npx lerna run build
npx lerna run test
1
2

# 只对变更包执行

npx lerna run build --since
1

适合 CI 场景,构建速度提升明显。

# 发布演示

npx lerna version
npx lerna publish from-git
1
2

# 小结

Lerna 在这个场景里主要解决了三件事:

  • 多包统一管理与标准化命令执行
  • 包之间依赖关系管理更清晰
  • 发布流程可规模化、可自动化