Skip to content
On this page

Lerna 详解

简介

Lerna 是一个用于管理包含多个包的 JavaScript 项目的工具。它优化了使用 Git 和 npm/yarn 构建的多包存储库的工作流程,使开发人员能够将大型代码库分解为单独维护的包,同时保持它们在单个存储库中的优势。

安装

全局安装

bash
npm install -g lerna

项目安装

bash
npm install --save-dev lerna

初始化项目

bash
lerna init

此命令将在项目根目录创建以下结构:

lerna.json
packages/

基本配置

lerna.json 是 Lerna 项目的配置文件:

json
{
  "packages": [
    "packages/*"
  ],
  "version": "0.0.0",
  "npmClient": "yarn",
  "useWorkspaces": true
}

核心命令

1. 创建新包

bash
lerna create <package-name>

2. 安装依赖

bash
lerna bootstrap

3. 运行脚本

bash
lerna run <script-name>

4. 发布包

bash
lerna publish

版本管理策略

固定模式(Fixed/Locked)

所有包共享一个版本号,使用 lerna publish 时所有包都会更新到相同的版本。

独立模式(Independent)

每个包都有独立的版本号,使用 lerna publish --independent 可以为每个包独立更新版本。

工作流模式

1. Explicit Commits

  • 使用 lerna version 创建版本和标签
  • 使用 lerna publish from-git 从 Git 推送包

2. From Package Changes

  • 使用 lerna publish from-package 从 npm 推送包

最佳实践

1. 包组织

  • 将相关的包放在同一个 monorepo 中
  • 使用清晰的包命名约定
  • 保持包职责单一

2. 依赖管理

  • 使用 lerna bootstrap --hoist 将公共依赖提升到根目录
  • 定期同步依赖版本

3. 工作区集成

与 Yarn Workspaces 或 npm Workspaces 集成:

json
{
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

优缺点

优点

  • 跨包变更的原子性
  • 更简单的依赖管理
  • 统一的代码风格和测试
  • 便于代码复用

缺点

  • 仓库可能变得庞大
  • 需要更复杂的权限管理
  • 学习曲线较陡峭

与其他工具的比较

Lerna 与 Yarn Workspaces、pnpm Workspaces 等工具相比,更专注于版本管理和发布流程,而 Workspaces 主要关注依赖安装和链接。

迁移指南

从 Multirepo 迁移到 Lerna monorepo:

  1. 评估现有项目结构
  2. 决定包的拆分策略
  3. 设置 Lerna 项目
  4. 迁移代码和依赖
  5. 更新 CI/CD 流程