跳至主要内容

任务管道配置

Lerna 将 npm 脚本的运行(例如 fork 进程)委托给 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 会先为 myproj 运行 build
  3. build 本身定义了对 prebuild(在同一项目中)以及所有依赖项的 build 的依赖项。因此,它将运行 prebuild 脚本,并将为所有依赖项运行 build 脚本。

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

这种情况很常见

Mixing Targets

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

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