概念

当运行命令遇到错误时,Lerna 会将其记录到lerna-debug.log文件(与npm-debug.log)一样。

Lerna 同样也支持scoped packages

运行lerna --help查看所有可用的命令和配置项。

lerna.json

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish",
      "registry": "https://npm.pkg.github.com"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

说明:

属性名 描述
version 当前版本
npmClient 指定运行命令的客户端(也可以根据每个命令单独指定)。设定为"yarn"则使用yarn运行。默认值是"npm"
command.publish.ignoreChanges 通配符的数组,其中的值不会被 lerna 监测更改和发布。使用它可以防止因更改发布不必要的新版本,比如仅仅是修复 README.md 的错误。
command.publish.message 执行发布版本更新时的自定义提交消息。更多细节见@lerna/version
command.publish.registry 使用它来设置要发布的自定义注册 url,而非 npmjs.org,如果需要的话,您必须经过授权。
command.bootstrap.ignore 运行lerna bootstrap指令时会忽视该字符串数组中的通配符匹配的文件。
command.bootstrap.npmClientArgs 该字符串数组中的参数将在lerna bootstrap命令期间直接传递给npm install
command.bootstrap.scope 该通配符的数组会在lerna bootstrap命令运行时限制影响的范围。
packages 表示包位置的全局变量数组。

lerna.json中的packages配置是一个通配符列表,用于匹配包含了package.json的的目录。这就是 lerna 识别“叶子”包(和“根”package.json相对应,用于管理整个仓库的开发依赖和脚本)。

默认情况下,lerna 将包的列表初始化为["packages/*"],但是您也可以使用另一个目录,比如["modules/*"]["package1", "package2"]。定义的通配符是相对于lerna.json所在的目录的,该目录通常是存储库的更目录。唯一的限制是不能直接嵌套包的未知,但是该限制在“普通” npm 包中也是存在的。

举个栗子🌰,["packages/*", "src/**"]匹配的是下面这样的树形结构:

packages/
├── foo-pkg
│   └── package.json
├── bar-pkg
│   └── package.json
├── baz-pkg
│   └── package.json
└── qux-pkg
    └── package.json
src/
├── admin
│   ├── my-app
│   │   └── package.json
│   ├── stuff
│   │   └── package.json
│   └── things
│       └── package.json
├── profile
│   └── more-things
│       └── package.json
├── property
│   ├── more-stuff
│   │   └── package.json
│   └── other-things
│       └── package.json
└── upload
    └── other-stuff
        └── package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

定位packages/*下的叶子包被认为是“最佳实践”,但不是使用 Lerna 的必要条件。

一些已经废弃的字段

一些lerna.json字段已不再使用。值得注意的包括:

  • lerna: 原本用于指示当前 Lerna 的版本。在 v3 中被废弃删除

常见的devDependencies

通过Lerna link convert,大多数devdependency可以被拉到 Lerna 库的根目录。

上面的命令将自动提升(hoist)文件并使用相对的files文件说明符。

提升有如下好处:

  • 所有的包使用的依赖版本均相同。
  • 可以使用GreenKeeper之类的自动化工具更新根目录中的依赖。
  • 降低了依赖安装时间。
  • 所需的存储空间更少了。

注意,提供 npm 脚本使用的“二进制”可执行文件的devdependency仍然需要直接安装在使用它们的每个包中。

例如,对于正确运行lerna run nsp(以及在包的目录中运行npm run nsp)来说,nsp依赖关系是必须的:

{
  "scripts": {
    "nsp": "nsp"
  },
  "devDependencies": {
    "nsp": "^2.3.3"
  }
}
1
2
3
4
5
6
7
8

Git 托管的依赖

Lerna 允许本地依赖包的目标版本通过committish编写为git 远程 url(例如#v1.0.0#semver:^1.0.0)。而非正常数值范围版本。当包必须为私有且无需私有的 npm 注册表时,允许通过 git 仓库发包。

请注意,lerna 并没有实际地将 git 历史记录分割到单独的只读存储库当中。这是用户的事情。(点击这里了解实现细节)。

// packages/pkg-1/package.json
{
  name: "pkg-1",
  version: "1.0.0",
  dependencies: {
    "pkg-2": "github:example-user/pkg-2#v1.0.0"
  }
}

// packages/pkg-2/package.json
{
  name: "pkg-2",
  version: "1.0.0"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在上面的示例中:

  • lerna bootstrap会将pkg-2pkg-1恰当的连接起来。
  • lerna publishpkg-2发生变化时,它将更新pkg-1中的 committish (#v1.0.0)。

README 标签

用 Lerna 不整一个标签么?lerna

[![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org/)
1

向导

如果您喜欢一些关于 cli 的指导信息(如果您即将开始使用 lerna 或将其介绍给一个新的团队),那么您可能会喜欢lerna-wizard。它通过一些定义好的步骤来帮助您:

image