在現代前端開發中,使用 Monorepo 管理多個專案已成為趨勢。為了提升開發效率,合理配置 Turborepo 的快取機制至關重要。本文將深入介紹如何配置 Turborepo 的快取約定,並提供詳細的代碼範例。
一、配置快取約定
{
"pipeline": {
"build": {
"outputs": [".next/**", "!.next/cache/**"],
"dependsOn": ["^build"]
}
}
}
上述配置將快取 build 任務產生的 .next 資料夾內容,但排除 cache 資料夾。如果任務沒有產生任何輸出檔案(例如 test 任務),可以省略 outputs 聲明。即使沒有任何檔案產生,Turborepo 也會自動記錄和快取每個任務的日誌;當原始檔案沒有更改時,重新執行任務會直接輸出快取的日誌。
{
"pipeline": {
"test": {
"dependsOn": ["build"],
"inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts"]
}
}
}
上述配置表示只有當指定的 src 或 test 檔案發生變更時,才會執行 test 任務。
禁用寫入快取:
對特定任務,在 turbo.json 中配置:
{
"pipeline": {
"dev": {
"cache": false
}
}
}
使用命令行參數:
turbo dev --no-cache
禁用讀取快取,強制重新執行任務:
turbo build --force
二、過濾工作區
在某些情況下,我們可能只想執行某個工作區的任務。可以使用過濾器來達成。
turbo build --filter=my-pkg
執行名稱相似的工作區:
turbo run build --filter=admin-*
2. 多個過濾器
同時過濾多個工作區:
turbo build --filter=my-pkg --filter=my-app
3. 運行依賴指定工作區的所有其他工作區
執行所有依賴 my-lib 的工作區:
turbo test --filter=...my-lib
排除 my-lib 本身:
turbo test --filter=...^my-lib
4. 運行指定工作區及其依賴
執行 my-app 及其所有依賴:
turbo build --filter=my-app...
排除 my-app 本身:
turbo build --filter=my-app^...
5. 按目錄過濾
turbo build --filter='./app/*'
6. 排除工作區
turbo run build --filter=!@foo/bar
三、在單一工作區配置 turbo.json
除了在根目錄下配置 turbo.json 外,還可以在每個工作區單獨配置,用於聲明針對該工作區的 Turbo 配置。
注意:必須定義 extends 欄位。
{
"extends": ["//"],
"pipeline": {
"build": {
"dependsOn": ["compile"]
},
"compile": {}
}
}
"//" 是一個特殊標識符,用於指向 Monorepo 的根目錄。
四、Yarn Workspace
Turborepo 只負責任務的處理及快取,不負責依賴和工作區的管理。因此,需要使用 npm、Yarn 或 pnpm 進行依賴管理。以下是使用 Yarn 的示例。
{
"name": "my-monorepo",
"workspaces": [
"docs",
"apps/*",
"packages/*"
]
}
{
"name": "shared-utils"
}
{
"dependencies": {
"shared-utils": "*"
}
}
聲明後,需要在根目錄執行 yarn install 進行安裝。
五、快速開始
yarn global add turbo
2. 建立新的 Monorepo
yarn dlx create-turbo@latest
pnpm dlx create-turbo@latest
3. Turbo 的運作
Turbo 的配置檔位於專案根目錄下的 turbo.json:
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**", ".next/**", "!.next/cache/**"]
},
"lint": {},
"dev": {
"cache": false
}
}
}
執行任務:
turbo lint
再次執行任務時,若無變更,Turbo 會從快取中直接輸出結果,提升效率。
結語
透過合理配置 Turborepo 的快取機制,我們可以大幅提升 Monorepo 開發的效率。希望本文能夠幫助您更好地理解和應用 Turborepo,為您的開發工作帶來便利。