跳至主要內容

任務管線設定

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"] } 表示專案的特定「測試」目標必須在其自己的「建置」目標執行完成之後才能執行,但 "build": { "dependsOn": ["^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"
]
}
}
}
}