Nx、Turborepo 還是 Bazel?工具怎麼選
一句話總結:小中型團隊選 Turborepo(簡單快速),中大型選 Nx(功能完整),超大型跨語言選 Bazel(極致效能但學習曲線陡峭)。
結論先講:工具不是重點,你的需求才是。三人團隊用 Bazel 是用牛刀殺雞,百人團隊用 Lerna 是拿剪刀砍樹。
四個主流工具
Nx:功能最完整。智慧快取、相依圖視覺化、程式碼產生器、支援多種框架。適合中大型團隊。學習曲線中等。
Turborepo:Vercel 維護,主打「簡單快速」。輕量級的建構排程器,配置簡單。適合小中型團隊,JS/TS 生態系首選。
Lerna:最早期的 JS Monorepo 工具,現在由 Nx 團隊接手。核心功能是管理多套件的版本發佈。適合主要需求是統一發佈 npm 套件的場景。
Bazel:Google 開源的建構系統。極致的快取、跨語言支援(Java、C++、Go、Python、JS)、遠端執行。但學習曲線極陡、設定複雜。只適合超大型組織。
快速比較:
| 特性 | Nx | Turborepo | Lerna | Bazel |
|---|---|---|---|---|
| 學習曲線 | 中等 | 低 | 低 | 極高 |
| 多語言支援 | 有限 | JS/TS 為主 | JS/TS | 完整 |
| 適合規模 | 中大型 | 小中型 | 小型 | 超大型 |
CI/CD:只建構受影響的東西
Monorepo 的 CI 最重要的優化就一個字:只跑改到的。
不管是 Nx 的 nx affected 還是 Turborepo 的變更偵測,核心概念一樣:比較這次 commit 跟上次的差異,算出哪些專案被影響了,只對那些跑 lint、test、build。
改了一行 README,不需要跑 50 個專案的完整 CI。改了 shared/utils,只有依賴它的那幾個 app 需要重跑。
Multirepo 的版本一致性怎麼維持?
Multirepo 不是沒解法:
- Renovate / Dependabot:自動化依賴版本升級,自動開 PR
- 語意化版本:嚴格遵循 SemVer,breaking change 升 major
- CI 中的相依驗證:shared library 發版時自動觸發下游專案的 CI
這篇的重點回顧
工具選擇看團隊規模和需求。Monorepo 的 CI 核心是受影響偵測。Multirepo 用自動化工具維持版本一致性。
系列文章:
- Monorepo vs Multirepo(一):策略比較
- 你在這裡 → Monorepo vs Multirepo(二):工具鏈與 CI/CD
- Monorepo vs Multirepo(三):演進歷史與務實選擇
「工具是手段不是目的——你買了最好的釘槍,但你的問題可能需要的是螺絲起子。」