快取什麼?
預設情況下,Turborepo 總是會擷取所有任務的控制台輸出。如果你的任務沒有發出任何檔案(例如使用 Jest 的單元測試),你可以省略 outputs
。除此之外,你通常需要指定需要擷取(和還原!)哪些磁碟檔案,才能執行後續依賴任務。
設定快取輸出
你可以在 Turborepo 中設定快取輸出,方法是在 pipeline.<task>.outputs
內指定一組 glob,如下例所示
{
"$schema": "https://turbo.dev.org.tw/schema.json",
"pipeline": {
"build": {
"outputs": ["dist/**"]
}
}
}
包含
在上述 build
任務定義中,請注意它適用於整個 Turborepo 中所有的 build
任務。每個個別任務的輸出位置很可能略有不同,特別是隨著儲存庫的成長。
例如,你可能有一個工具工作區,其在建置期間產生的成品出現在 lib
中,而不是 dist
,這表示你之前的定義無法同時適用於工具和應用程式,其輸出成品出現在 dist
中。
有兩種方法可以解決這個問題。第一個選項是將 lib
目錄包含在輸出中
{
"$schema": "https://turbo.dev.org.tw/schema.json",
"pipeline": {
"build": {
"outputs": ["dist/**", "lib/**"]
}
}
}
只要 dist
和 lib
資料夾對 turborepo 中的所有工作區都從空開始,這個模式就會很好用。turbo
會擷取出現在這些資料夾中的所有檔案。
不過,如果模式在所有工作區中不夠一致,你可以為每個工作區定義,或使用工作區設定。
{
"$schema": "https://turbo.dev.org.tw/schema.json",
"pipeline": {
"app#build": {
"outputs": ["dist/**"]
},
"util#build": {
"outputs": ["lib/**"]
}
}
}
你會注意到你必須使用/**
運算子來指定目錄中的所有檔案。只指定目錄名稱(例如lib
)只會包含目錄本身,而不包含其內容。
排除
有時候,指定哪些檔案需要快取的最簡單方法是指定要包含的檔案組合,以及已包含的檔案集中哪些檔案應該排除。
例如,使用預設設定的 Next.js 應用程式最簡單的設定如下所示
{
"$schema": "https://turbo.dev.org.tw/schema.json",
"pipeline": {
"app#build": {
"outputs": [".next/**", "!.next/cache/**"],
}
}
}
若要排除檔案,你可以指定一個以!
開頭的 glob 模式,以排除任何符合的內容。