常见问题

英文原地址

该文档原作者仍旧保持更新,如果英文内容有新增,请通知。

如何将包添加到 Lerna 库?

对于添加到 Lerna 存储库中的任何包,您应该运行[lerna bootstrap](https://github.com/lerna/lerna/blob/master/commands/bootstrap/README.md),而不是运行npm安装。这将考虑到包文件夹中的现有项目以及外部依赖关系。

新包

packages文件夹中为您的包创建一个目录,并正常运行npm init来创建package.json

现有包

您可以使用[lerna import <package>][lerna import <package>]将现有的包转移到 Lerna 存储库中;此命令将保存提交历史记录。

[lerna import <package>][lerna import <package>]采用本地路径而不是 URL。在这种情况下,您需要在文件系统中有连接到仓库。

如果publish失败了,我如何重试呢?

有些时候lerna publish不起作用。可能是您的网络出现了波动,也可能是没有登录到 npm 等等。

如果lerna.json并没有更新,重试一下lerna publish

如果已经更新,您可以强制重新发布。lerna publish --force-publish $(ls packages/)

bootstrap 过程慢到爆,咋办啊?

包含许多包的项目可能需要很长时间才能启动。

如果您开启 hoisting 那么就可以显著地降低lerna bootstrap花费的时间,更多信息请参阅hoisting 文档

与此相结合,您可以通过使用yarn而不是npm客户端来提高bootstrap的性能。

根目录package.json

根目录的package.json至少是您在 CI 构建期间本地安装lerna的方式。您还应该将您的测试、语法检查和类似的任务放在那里,从根目录运行它们,因为单独从每个包运行它们会比较慢。根目录还可以保存所有“hoisted”的包,这在使用——hoist时加速了 bootstrap。

CI 设置

正如上面所提到的根目录的package.json负责本地安装lerna。不过您需要自动运行bootstrap。这可以通过将其作为 npm 脚本在 CI 阶段使用来实现。

示例:

{
  "name": "my-monorepo",
  "private": true,
  "devDependencies": {
    "eslint": "^3.19.0",
    "jest": "^20.0.4",
    "lerna": "^2.0.0"
  },
  "scripts": {
    "bootstrap": "lerna bootstrap --hoist",
    "pretest": "eslint packages",
    "test": "jest"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

以 CircleCI 配置文件为例 (circle.yml):

dependencies:
  post:
    - npm run bootstrap
1
2
3