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 的主要優勢
注意事項
緩存是一把雙刃劍,配置不當可能導致錯誤的正面結果。
共享緩存功能在 Vercel 的付費版本中提供。
總結
Turborepo 為 monorepo 管理提供了強大的工具,尤其在提高 CI 效率方面表現出色。雖然作者尚未在生產環境中使用,但初步實驗結果令人鼓舞。對於管理大型 monorepo 專案的團隊來說,Turborepo 值得考慮。