設定
Lernaの設定は、lerna.json
とnx.json
の2つのファイルに分割されています。
lerna.json
npmClient
パッケージマネージャーとしてnpm
を使用していない場合(例えばyarn
やpnpm
を使用している場合)、Lernaが設定やパッケージを解決する際に内部ロジックを調整できるように、この値を設定することが重要です。これは特にpnpm
の場合に当てはまります。なぜなら、pnpm
はワークスペース構成を定義するために別のpnpm-workspaces.yaml
ファイルを使用するからです。
packages
デフォルトでは、Lernaは選択したパッケージマネージャーから既存のworkspaces
設定を再利用しようとします。Lernaが操作する利用可能なパッケージのサブセットを指定したい場合は、packages
プロパティを使用できます。これはLernaにpackage.json
ファイルを探す場所を指示します。
{
"packages": ["packages/*"]
}
version
Lernaには、パッケージを公開する2つのモードがあります。fixed
とindependent
です。fixedモードを使用する場合、影響を受けるすべてのパッケージは同じバージョンを使用して公開されます。最後に公開されたバージョンは、次のようにlerna.json
に記録されます。
{
"version": "1.2.0"
}
independentモードを使用する場合、すべてのパッケージは個別にバージョン管理され、lerna.json
は次のようになります。
{
"version": "independent"
}
詳細については、バージョン管理と公開のドキュメントを参照してください。
commands
lerna.json
ファイルは、次のように各コマンドのオプションをエンコードすることもできます。
{
"command": {
"version": {
"allowBranch": "main",
"conventionalCommits": true
}
}
}
利用可能なオプションについては、APIドキュメントを参照してください。
Nx.json
注:"{projectRoot}"と"{workspaceRoot}"はタスクランナーがサポートする特別な構文であり、コマンド実行時に内部で適切に補間されます。したがって、"{projectRoot}"または"{workspaceRoot}"を固定パスに置き換えることは、構成の柔軟性を損なうため避けるべきです。
{
"namedInputs": {
"default": ["{projectRoot}/**/*"],
"prod": ["!{projectRoot}/**/*.spec.tsx"]
},
"targetDefaults": {
"build": {
"dependsOn": ["prebuild", "^build"],
"inputs": ["prod", "^prod"],
"outputs": ["{projectRoot}/dist"],
"cache": true
},
"test": {
"inputs": ["default", "^prod", "{workspaceRoot}/jest.config.ts"],
"cache": true
}
}
}
ターゲットのデフォルト
ターゲットはnpmスクリプトの名前です。リポジトリ内の各プロジェクトのビルドスクリプトなどに関連付けられたメタデータをtargetDefaults
セクションに追加できます。
cache
true
に設定すると、Nxにスクリプトの実行結果をキャッシュするように指示します。ほとんどのリポジトリでは、長時間実行されないタスク(つまり、serve
ではないタスク)はすべてキャッシュ可能です。
dependsOn
ターゲットは他のターゲットに依存できます。一般的なシナリオは、プロジェクトをビルドする前に、プロジェクトの依存関係を最初にビルドする必要がある場合です。dependsOn
プロパティを使用して、個々のターゲットの依存関係を定義できます。
"dependsOn": [ "prebuild", "^build"]
は、すべてのビルドスクリプトで同じプロジェクトのprebuildスクリプトとすべての依存関係のビルドスクリプトを最初に実行する必要があることをNxに伝えます。
inputs & namedInputs
inputs
配列は、スクリプトの特定の呼び出しがキャッシュヒットになるかどうかを判断するために何を考慮するかをNxに伝えます。入力には3つのタイプがあります。
ファイルセット
例
{projectRoot}/**.*.ts
{fileset: "{projectRoot}/**/*.ts"}
と同じ{workspaceRoot}/jest.config.ts
{fileset: "{workspaceRoot}/jest.config.ts"}
と同じ
ランタイム入力
例
{runtime: "node -v"}
Nodeの結果値はハッシュ化されるため、表示されることはありません。
環境変数
例
{env: "MY_ENV_VAR"}
Nodeの結果値はハッシュ化されるため、表示されることはありません。
名前付き入力
例
inputs: ["prod"]
inputs: [{input: "prod", projects: "self"}]
と同じ
多くの場合、同じglobが多くの場所に出現します(例:prodファイルセットはすべてのプロジェクトのspecファイルを除外します)。これらを同期させ続けることはエラーが発生しやすいため、名前付き入力を定義し、それらの場所すべてで参照することをお勧めします。
^の使用
例
inputs: ["^prod"]
inputs: [{input: "prod", projects: "dependencies"}]
と同じ
dependsOn
と同様に、"^"記号は「依存関係」を意味します。これは非常に重要な考え方なので、例を挙げて説明しましょう。
"test": {
"inputs": [ "default", "^prod" ]
}
上記の構成は、テストターゲットが特定のプロジェクトのすべてのソースファイルと、その依存関係のprodソース(非テストソース)のみに依存することを意味します。言い換えれば、テストソースをプライベートとして扱います。remixapp
プロジェクトがheader
ライブラリに依存している場合、header
テストを変更しても、remixapp
テストターゲットには影響しません。
outputs
"outputs": ["{projectRoot}/dist"]
は、ビルドスクリプトがファイルアーティファクトを作成する場所をNxに伝えます。提供された値は実際にはデフォルトであるため、この場合は省略できます。"outputs": []
は、テストターゲットがディスク上にアーティファクトを作成しないことをNxに伝えます。必要に応じて、多くの出力リストを作成できます。また、globや個々のファイルをoutputとして使用することもできます。
この構成は通常必要ありません。Nxには、上記の構成を実装する適切なデフォルトが付属しています。
プロジェクト固有の構成
プロジェクトが類似している多くのワークスペースでは、nx.json
にNx構成全体が含まれます。プロジェクトのpackage.json
ファイルに配置されるプロジェクト固有の構成を持つと便利な場合があります。
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.tsx",
"{workspaceRoot}/configs/webpack.conf.js"
]
},
"targets": {
"build": {
"dependsOn": [
"^build"
],
"inputs": [
"prod",
"^prod"
],
"outputs": [
"{workspaceRoot}/dist/parent"
]
}
}
"implicitDependencies": ["projecta", "!projectb"]
}
}
注:nx.json
で定義されたnamedInputs
とtargetDefaults
は、単なるデフォルトです。その構成を取得してすべてのプロジェクトのpackage.json
ファイルにコピーした場合、結果は同じになります。
言い換えれば、すべてのプロジェクトには名前付き入力のセットがあり、次のように定義されています。{...namedInputsFromNxJson, ...namedInputsFromProjectsPackageJson}
。すべてのターゲット/スクリプトのdependsOn
は、dependsOnFromProjectsPackageJson || dependsOnFromNxJson
として定義されます。inputs
とoutputs
にも同じことが当てはまります。
inputs & namedInputs
特定のターゲットに対してinputs
を定義すると、nx.json
で定義されたそのターゲット名の入力セットが置き換えられます。擬似コードinputs = packageJson.targets.build.inputs || nxJson.targetDefaults.build.inputs
を使用します。
また、名前付き入力を定義および再定義することもできます。これにより、nx.json
が次のようなものを定義できる1つの主要なユースケースが可能になります(すべてのプロジェクトに適用されます)。
"test": {
"inputs": [
"default",
"^prod"
]
}
そして、プロジェクトはtest
ターゲットの入力を再定義する必要なく、prodファイルセットを定義できます。
{
"name": "parent",
"scripts": {
"build": "...",
"test": "..."
},
"dependencies": {...},
"nx": {
"namedInputs": {
"prod": [
"!{projectRoot}/**/*.test.js",
"{workspacRoot}/jest.config.js"
]
}
}
}
この場合、Nxは各プロジェクトに適切なprod
入力を使用します。
dependsOn
特定のターゲットに対してdependsOn
を定義すると、nx.json
で定義されたそのターゲット名のdependsOn
が置き換えられます。擬似コードdependsOn = packageJson.targets.build.dependsOn || nxJson.targetDefaults.build.dependsOn
を使用します。
outputs
特定のターゲットに対してoutputs
を定義すると、nx.json
で定義されたそのターゲット名のoutputs
が置き換えられます。擬似コードoutputs = packageJson.targets.build.outputs || nxJson.targetDefaults.build.outputs
を使用します。
implicitDependencies
"implicitDependencies": ["projecta", "!projectb"]
行は、親プロジェクトがpackage.json
に依存関係がないにもかかわらず、projecta
に依存していることをNxに伝えます。Nxはこのような依存関係を明示的な依存関係と同じように扱います。また、projectb
に明示的な依存関係があるにもかかわらず、無視する必要があることをNxに伝えます。
追加の設定
タスクとキャッシュを構成する追加の方法については、関連するNxドキュメントを参照してください。