Mono-repo 管理的循環依賴與反向依賴問題
在 Mono-repo 開發中,依賴管理是一件很重要但又容易出錯的事情,尤其是 循環依賴 和 反向依賴。這兩種問題不只會讓專案建構失敗,還會帶來維護上的困擾。
公司現在用 Nx 管理專案,但因為團隊裡有些人不熟悉 Nx,導致 Build 時常出錯,所以寫這篇文章來整理一些解決方案,希望能幫助大家更順利開發!
什麼是循環依賴?
假設有兩個共用函式庫:
-
Library A 使用了 Library B 的內容。
-
Library B 又使用了 Library A 的內容。 這種互相依賴的情況叫做循環依賴,容易讓專案出錯,例如:
-
編譯時候出問題。
-
執行時候發生奇怪的行為。
什麼是反向依賴?
假設你的共用函式庫(libs)不小心去引用了專案內容(apps),這叫反向依賴,會讓 Nx 在建構時出問題。
例如:
- libs 引用了專案 A 的代碼。
- 當你建構專案 B 時,Nx 會先建構專案 A,因為 libs 有依賴 A。
- 如果專案 A 或 B 有錯誤,整個流程就會失敗。
為什麼不該讓它們互相依賴?
- 容易出錯:循環依賴會讓建構流程報錯,或者無法正常運作。
- 難以維護:代碼改來改去,不知道會影響哪些地方,會讓專案很難管理。
- 設計不清楚:一個專案應該是「誰用誰」,而不是「大家互相用」。
Nx 的設定檔如何幫你管理依賴?
如何避免循環依賴或反向依賴?
- 檢查依賴關係:輸入 nx graph,可以看到專案和函式庫的依賴圖。
- 設計共用函式庫:把大家需要用的功能,放到一個獨立的 Library 裡,例如 libs/shared,讓其他函式庫引用它。
- 遵守規則:共用函式庫(libs)只能引用其他函式庫,不要去引用專案的內容(apps)。
小結
- 循環依賴和反向依賴會讓專案很難建構成功,應該避免。
- Nx 幫你管理所有建構流程,會自動處理依賴,但要設計好架構,避免互相使用。
- 用 nx graph 檢查誰依賴了誰,發現問題後,調整 Library 的設計。