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)、遠端執行。但學習曲線極陡、設定複雜。只適合超大型組織。

快速比較:

特性NxTurborepoLernaBazel
學習曲線中等極高
多語言支援有限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 用自動化工具維持版本一致性。

系列文章:

「工具是手段不是目的——你買了最好的釘槍,但你的問題可能需要的是螺絲起子。」