本文へスキップ

タスクパイプラインの設定

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`プロパティを定義すると、`sort`フラグは無視されます。

このメカニズムは非常に柔軟です。次の例を見てみましょう。

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

注:以前のバージョンのNxは、`targetDefaults`の代わりに`targetDependencies`を使用していました。どちらも機能しますが、`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"
]
}
}
}
}