iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
自我挑戰組

讓我們一起與turboRepo共舞系列 第 21

深入探討 Turborepo 快取配置:提升 Monorepo 開發效率的秘訣

  • 分享至 

  • xImage
  •  

在現代前端開發中,使用 Monorepo 管理多個專案已成為趨勢。為了提升開發效率,合理配置 Turborepo 的快取機制至關重要。本文將深入介紹如何配置 Turborepo 的快取約定,並提供詳細的代碼範例。

一、配置快取約定

  1. 配置快取輸出
    要覆蓋預設的快取輸出行為,需要在 pipeline..outputs 中設定。例如:
{
  "pipeline": {
    "build": {
      "outputs": [".next/**", "!.next/cache/**"],
      "dependsOn": ["^build"]
    }
  }
}

上述配置將快取 build 任務產生的 .next 資料夾內容,但排除 cache 資料夾。如果任務沒有產生任何輸出檔案(例如 test 任務),可以省略 outputs 聲明。即使沒有任何檔案產生,Turborepo 也會自動記錄和快取每個任務的日誌;當原始檔案沒有更改時,重新執行任務會直接輸出快取的日誌。

  1. 配置快取的輸入
    可以透過 inputs 指定只有當相關檔案變更時才重新執行該任務。例如:
{
  "pipeline": {
    "test": {
      "dependsOn": ["build"],
      "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts"]
    }
  }
}

上述配置表示只有當指定的 src 或 test 檔案發生變更時,才會執行 test 任務。

  1. 關閉快取
    注意:寫入快取和讀取快取是分開的。

禁用寫入快取:

對特定任務,在 turbo.json 中配置:

{
  "pipeline": {
    "dev": {
      "cache": false
    }
  }
}

使用命令行參數:

turbo dev --no-cache
禁用讀取快取,強制重新執行任務:

turbo build --force
二、過濾工作區
在某些情況下,我們可能只想執行某個工作區的任務。可以使用過濾器來達成。

  1. 按工作區名稱過濾
    執行特定工作區的任務:

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 的示例。

  1. 配置工作區
    在根目錄的 package.json 中:
{
  "name": "my-monorepo",
  "workspaces": [
    "docs",
    "apps/*",
    "packages/*"
  ]
}
  1. 為工作區命名
    每個工作區的 package.json 中需要指定唯一的名稱:
{
  "name": "shared-utils"
}
  1. 引入某個工作區
    在當前工作區的 package.json 中,將其他工作區作為依賴項:
{
  "dependencies": {
    "shared-utils": "*"
  }
}

聲明後,需要在根目錄執行 yarn install 進行安裝。

五、快速開始

  1. 安裝 Turbo

yarn global add turbo
2. 建立新的 Monorepo

使用 yarn

yarn dlx create-turbo@latest

或者使用 pnpm

pnpm dlx create-turbo@latest
3. Turbo 的運作
Turbo 的配置檔位於專案根目錄下的 turbo.json:

{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**", "!.next/cache/**"]
    },
    "lint": {},
    "dev": {
      "cache": false
    }
  }
}

執行任務:

執行 lint

turbo lint
再次執行任務時,若無變更,Turbo 會從快取中直接輸出結果,提升效率。

結語
透過合理配置 Turborepo 的快取機制,我們可以大幅提升 Monorepo 開發的效率。希望本文能夠幫助您更好地理解和應用 Turborepo,為您的開發工作帶來便利。


上一篇
Monorepo: 一個倉庫統治所有代碼的神奇魔法
下一篇
turboRepo 單一儲存庫設置
系列文
讓我們一起與turboRepo共舞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言