ファイル入力
デフォルトでは、ワークスペース内のファイルが変更されると、ワークスペースが更新されたと見なされます。しかし、リポジトリ全体のすべてのファイルの変更がタスクの再実行につながるべきではありません。Turborepoは、重要なファイルを定義できるツールを提供します。
グローバルファイル
ほとんどのリポジトリには、リポジトリのルートに表示されるいくつかの設定があります。これらのファイルは、子ワークスペースの動作に影響を与える可能性があります。
package.json
と turbo.json
デフォルトで、Turborepoはルートのpackage.json
とルートのturbo.json
ファイルをグローバルハッシュに含めます。個別に指定する必要はありません。
追加の入力の指定
ルートのtsconfig.json
など、すべてのワークスペースで考慮する必要がある追加ファイルがある場合は、globalDependencies
で指定する必要があります。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"globalDependencies": ["tsconfig.json"],
"pipeline": {
"type-check": {}
}
}
このカスタマイズは、package.json
とturbo.json
に対するTurborepoのデフォルトの動作に追加的です。
この例では、ルートのtsconfig.json
ファイルが変更されると、turborepoのすべてのタスクが再実行されます。
ワークスペースファイル
ワークスペースの外側に表示されるグローバルファイルに加えて、ワークスペースごとに含めるファイルを指定することもできます。
package.json
と turbo.json
各ワークスペースのpackage.json
とturbo.json
(存在する場合)の内容は、ワークスペースのハッシュに自動的に考慮されます。この動作は設定できません。
Turborepoのデフォルト動作
Turborepoのデフォルト動作は、リポジトリを検査し、ハッシュ計算に含めるべきファイルを特定することです。Turborepoは通常、考慮すべきファイルを特定するためにGitを使用します。
- ワークスペースディレクトリの子供であるGitインデックスに表示されるすべてのファイル。
- ワークスペースディレクトリの子供であり、
.gitignore
で無視されていないすべての追跡されていないファイル。
Gitが利用できない場合、またはリポジトリが設定されていない場合、次の戦略を使用して、Gitインデックスに表示される内容を推定しようとします。
- ワークスペースディレクトリの子供であるすべてのファイルを含めます。
- ルートの
.gitignore
とワークスペースディレクトリの.gitignore
に表示されるすべてのファイルを除外します。
これらの2つのアプローチは、常に同一の結果を生むとは限りません!同一の結果を生み出さないシナリオ
.gitignore
ファイルがディレクトリ階層の他の場所に存在する場合。- Gitインデックスに追加されたファイルで、
.gitignore
にも指定されているファイル。
最大限の正確性のために、GitとリポジトリのGitインデックスの両方が利用できることを目指すべきです。
動作のカスタマイズ
inputs
をカスタマイズすると、デフォルトの動作からすぐにオプトアウトされます。pipeline.<task>.inputs
を使用して、考慮すべきすべてのファイルをマニュアルで指定する必要があります。
便宜上、特別な文字列$TURBO_DEFAULT$
をinputs配列内で使用して、デフォルトの動作で考慮されるすべてのファイルを自動的に含めることができます。これにより、デフォルトで考慮されたすべてのファイルをマニュアルで指定する必要なく、入力をカスタマイズできます。
一部のタスクでは、タスクハッシュの考慮事項へのファイル入力の数を減らすことが有益です。README.md
の内容に依存するタスクはほとんどありません。重要なファイルのみを指定すると、キャッシュヒットの頻度を高めることができます。
たとえば、多くのbuild
タスクでは、重要なファイルはsrc
ディレクトリに表示される可能性があります。あるいは、test
タスクは、src
およびtest
ディレクトリのファイルのみに依存する可能性があります。pipeline.<task>.inputs
に渡されたglobパターンを使用して指定できます。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"pipeline": {
"build": {
"inputs": ["src/**"]
},
"test": {
"inputs": ["src/**", "test/**"]
}
}
}
これらのglobパターンはワークスペースのパスを基準としているため、website
アプリ内のbuild
では、/apps/website/src/**
をファイル入力として扱い、utils
ワークスペース内のbuild
では、/packages/utils/src/**
をファイル入力として扱います。
あるタスクがファイル依存関係を指定する別のタスクに依存する場合、再度リストする必要はありません。タスク間の依存関係を使用して、すべてのファイル依存関係が満たされるようにすることができます。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"inputs": ["src/**"]
},
"test": {
// This task dependsOn build...
"dependsOn": ["build"],
// ...which means that it does not need to specify "src/**" here:
"inputs": ["test/**"]
}
}
}
このパターンを使用すると、すべてのタスクに対してファイルグロブのリストを繰り返し列挙する必要がなくなります。
デフォルトの動作を維持したいが、いくつかのファイルのみを含めたり除外したりすることもできます。特別な文字列$TURBO_DEFAULT$
を使用して、デフォルトで考慮されたすべてのファイルを含めることができます。
{
"$schema": "https://turbo.dokyumento.jp/schema.json",
"pipeline": {
"build": {
"inputs": ["$TURBO_DEFAULT$", "!README.md", "a-git-ignored-file.txt"]
}
}
}