iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

Monorepo(單一程式碼庫)是一種將所有專案代碼放在同一個儲存庫中的架構風格。雖然這種方式可以讓所有內容集中管理,但也帶來了一些挑戰,特別是在持續整合(CI)方面。
常見問題:

包之間的相互依賴關係複雜
CI 流程難以管理,特別是當專案規模擴大時

傳統 CI 流程示例:
對於一個包含前端、後端和共享庫的 monorepo,典型的 CI 流程可能如下:

# lint all
npm run lint --workspaces --if-present

# build all
npm run build --workspace=shared-libs
npm run build --workspace=frontend --workspace=backend

# test&deploy all
npm run test --workspaces --if-present
npm run deploy --workspaces --if-present

這種方法在專案擴大時變得難以維護。
Turborepo:Monorepo 的救星
Turborepo 是一個專門用於管理 monorepo 複雜性的工具。它的核心概念之一是"管道"(pipelines),這允許定義包之間的關係和任務。
Turborepo 配置示例:

{
  "$schema": "https://turborepo.org/schema.json",
  "baseBranch": "origin/main",
  "pipeline": {
    "build": {
      "outputs": ["dist/**", "build/**"],
      "dependsOn": ["^build"]
    },
    "lint": {
      "outputs": []
    },
    "test": {
      "dependsOn": ["^build"],
      "outputs": []
    },
    "dev": {
      "cache": false
    },
    "deploy": {
      "dependsOn": ["build", "test", "lint"],
      "outputs": []
    }
  }
}

使用此配置,可以大大簡化 CI 流程:
npx turbo run build test lint deploy
Turborepo 的主要優勢

  • 智能緩存:Turborepo 可以檢測任務是否需要重新運行,基於之前的執行結果。這大大減少了不必要的構建和測試時間。
  • 共享緩存:可以在團隊成員和 CI 環境之間共享緩存,進一步提高效率。在測試中,構建時間從 34 秒減少到了 0.437 秒。
  • 靈活配置:可以針對不同的任務(如測試)設置特定的緩存更新條件。
  • 依賽關係圖:可以生成可視化的依賴關係圖,幫助理解專案結構。

注意事項

緩存是一把雙刃劍,配置不當可能導致錯誤的正面結果。
共享緩存功能在 Vercel 的付費版本中提供。

總結
Turborepo 為 monorepo 管理提供了強大的工具,尤其在提高 CI 效率方面表現出色。雖然作者尚未在生產環境中使用,但初步實驗結果令人鼓舞。對於管理大型 monorepo 專案的團隊來說,Turborepo 值得考慮。


上一篇
pnpm monoRepo 實際案例
下一篇
Turborepo的緩存機制
系列文
讓我們一起與turboRepo共舞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言