跳到主要内容

任务管道配置

Lerna 将运行 npm 脚本(分叉进程等)的工作委托给 Nx。nx.json 文件是您可以配置 Nx 如何执行此操作的地方。

提示

如果您没有 nx.json,请运行 npx lerna add-caching

并行运行任务

如果您想将运行脚本的进程数增加到 5(默认为 3),请传递以下参数:

npx lerna run build --concurrency=5

定义任务依赖(又称任务管道)

如果没有我们的帮助,Lerna 无法知道哪些目标(脚本)有先决条件,哪些没有。您可以在 nx.json 文件中定义任务依赖:

nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
}
}
}

通过这个配置,Lerna 知道在构建一个项目之前,需要先构建其所有依赖。但是对于测试没有任何约束。

一旦定义了 targetDefaults 属性,排序标志将被忽略。

这种机制非常灵活。让我们看看这个例子:

nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build", "prebuild"]
},
"test": {
"dependsOn": ["build"]
}
}
}

注意,Nx 的旧版本使用 targetDependencies 而不是 targetDefaults。两者仍然有效,但推荐使用 targetDefaults。

^ 符号(又称插入符号)简单地表示依赖。因此,"test": { "dependsOn": ["build"] } 意味着特定项目的 "test" 目标依赖于其自身的 "build" 目标已完成,而 "build": { "dependsOn": ["^build"] } 意味着特定项目的 "build" 目标依赖于该项目所有依赖的 "build" 目标已完成。

当运行 lerna run test --scope=myproj 时,上述配置会告诉 Lerna:

  1. myproj 运行 test 命令
  2. 但由于定义了 test -> build 的依赖,Lerna 会先运行 myprojbuild
  3. build 本身定义了对 prebuild(在同一个项目上)以及所有依赖的 build 的依赖。因此,它将运行 prebuild 脚本,并为所有依赖运行 build 脚本。

请注意,Lerna 不必在开始运行测试之前运行所有构建。任务编排器将尽可能并行运行尽可能多的任务,只要满足约束条件。

这种情况很常见:

混合目标

因为我们在 nx.json 中描述了规则,所以它们将应用于仓库中的所有项目。您还可以通过在项目的 package.json 中添加规则来定义特定于项目的规则。

{
...
"nx": {
"targets": {
"test": {
"dependsOn": [
"build"
]
}
}
}
}