什麼是 Monorepo?為什麼要使用它?
隨著軟體專案的成長,特別是在多模組、多應用程式的環境下,管理代碼的挑戰也隨之增加。傳統的 Multi-Repo 策略(每個模組使用獨立儲存庫)在版本一致性和依賴管理方面存在不少痛點,特別是當需要頻繁更新和協作時,容易引發衝突和整合困難。
Monorepo 是一種更集中的管理方式。透過將所有模組放在一個儲存庫中,開發團隊可以更容易地維持一致的依賴版本和共享代碼。這種方法在大型專案中具備幾個顯著優勢:
- 依賴一致性:Monorepo 確保所有模組使用相同版本的依賴,避免因為版本衝突而引起的問題。
- 跨模組重用和同步:允許模組之間共享代碼,並在單一提交中完成多個模組的變更,方便同步更新。
- 統一的 CI/CD 管理:可以使用一套測試和構建流程來處理所有模組,簡化 CI/CD 配置。
- 增量編譯和快取:通過增量構建和快取技術(如 NX 的增量編譯),Monorepo 能顯著減少重複編譯的時間,提高開發效率。
NX:專為 Monorepo 優化的開發工具
NX 是一個強大的 Monorepo 工具,專為管理多模組、多應用的專案而設計。它支援增量編譯、自動快取、依賴視覺化等功能,幫助開發團隊減少不必要的構建,提升整體開發效率。此外,NX 還具有任務調度、代碼生成和豐富的插件生態,適合大型團隊的專案開發需求。
此外,NX 可以與高效的包管理器 pnpm 搭配使用。pnpm 具備高度優化的快取和依賴管理能力,使得構建和測試更加高效。接下來,我們將介紹如何使用 NX 和 pnpm 建立並管理一個 Monorepo 專案,並說明其主要操作指令。
安裝 NX 和 pnpm
首先,確保已安裝 Node.js,然後使用以下命令來安裝 pnpm:
npm install -g pnpm
接著,使用 pnpm 安裝 NX CLI:
pnpm add -g nx
建立 NX 工作區
安裝完畢後,使用 NX 的 create-nx-workspace
指令來建立工作區。例如,要創建一個名稱為 my-workspace
的工作區:
nx create-nx-workspace@latest my-workspace
執行此命令後,NX 會提示選擇一個預設配置(如 React、Angular、Next.js 或空白工作區)。選擇所需配置(例如 React),NX 將自動生成一個標準化的 Monorepo 架構,包含 apps/
和 libs/
目錄,分別用於存放應用程式和可重用的函式庫。
配置 pnpm 工作區
要讓 pnpm 正確識別和管理 NX 工作區內的所有專案,請在根目錄的 package.json
中添加 workspaces
設定:
{
"name": "my-workspace",
"private": true,
"workspaces": ["apps/*", "libs/*"]
}
這樣,pnpm 就能高效地管理 Monorepo 中所有應用程式和函式庫的依賴關係。
創建應用程式與函式庫
NX 提供了多種 CLI 指令來簡化專案管理。可以使用 nx generate
(或簡寫 nx g
)來創建新的應用程式或函式庫。例如,要創建一個名為 my-new-app
的 React 應用程式:
nx g @nx/react:app apps/my-new-app
該指令會在 apps/my-new-app
路徑下創建一個新的應用程式,並自動處理所有依賴。
構建與運行應用程式
應用程式建立後,可以使用 NX 的構建和運行指令來開發。要構建 my-new-app
應用程式,可以執行:
nx build my-new-app
NX 的快取機制使構建過程更高效,並減少了不必要的重複編譯。要在本地伺服器上啟動應用程式以進行測試,則可以使用 nx serve
:
nx serve my-new-app
此命令會將應用程式運行於 http://localhost:4200
,方便開發測試。
測試應用程式
NX 提供 nx test
指令來執行單元測試。以下命令將運行 my-new-app
的所有測試案例:
nx test my-new-app
該命令會根據預設或自定義的測試配置來執行測試,幫助開發者快速驗證應用程式功能。
管理快取與 nx reset
NX 的快取功能極大提升了大型專案的開發效率。不過,如果發現因快取導致的非預期行為,可以通過 nx reset
清除快取:
nx reset
執行該命令後,NX 將從頭構建所有模組,確保結果基於最新代碼。
增量編譯與依賴管理
NX 支援增量編譯,能夠僅針對受影響的模組進行構建,顯著減少編譯時間。使用 nx affected
指令即可執行增量編譯:
nx affected --target=build
這項功能特別適合大型專案,可顯著提升構建效率。
結論
NX 和 pnpm 的組合讓 Monorepo 的管理變得更加高效。NX 提供了優秀的增量編譯和快取功能,而 pnpm 的快取和依賴管理進一步加速了整個流程。這使得 Monorepo 成為多模組、大型專案中一種優秀的選擇。