設定
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ドキュメントを参照してください。