任务管道配置
Lerna 将运行 npm 脚本(分叉进程等)的工作委托给 Nx。nx.json
文件是您可以配置 Nx 如何执行此操作的地方。
如果您没有 nx.json
,请运行 npx lerna add-caching
。
并行运行任务
如果您想将运行脚本的进程数增加到 5(默认为 3),请传递以下参数:
npx lerna run build --concurrency=5
定义任务依赖(又称任务管道)
如果没有我们的帮助,Lerna 无法知道哪些目标(脚本)有先决条件,哪些没有。您可以在 nx.json
文件中定义任务依赖:
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
}
}
}
通过这个配置,Lerna 知道在构建一个项目之前,需要先构建其所有依赖。但是对于测试没有任何约束。
一旦定义了
targetDefaults
属性,排序标志将被忽略。
这种机制非常灵活。让我们看看这个例子:
{
...
"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:
- 为
myproj
运行test
命令 - 但由于定义了
test -> build
的依赖,Lerna 会先运行myproj
的build
。 build
本身定义了对prebuild
(在同一个项目上)以及所有依赖的build
的依赖。因此,它将运行prebuild
脚本,并为所有依赖运行build
脚本。
请注意,Lerna 不必在开始运行测试之前运行所有构建。任务编排器将尽可能并行运行尽可能多的任务,只要满足约束条件。
这种情况很常见:
因为我们在 nx.json
中描述了规则,所以它们将应用于仓库中的所有项目。您还可以通过在项目的 package.json
中添加规则来定义特定于项目的规则。
{
...
"nx": {
"targets": {
"test": {
"dependsOn": [
"build"
]
}
}
}
}