公司的 Go 項目使用 dep 做為依賴管理的工具,在使用的過程中,因為項目依賴比較復雜,經常會遇到依賴沖突導致 dep ensure
命令無法執行成功。
比如,正在開發中的項目A依賴了B和C,而 B 項目也依賴了 C 項目。
依賴關系.png
A 項目的 Gopkg.toml
[[constraint]]
branch = "master"
name = "B"
[[constraint]]
branch = "master"
name = "C"
B 項目的 Gopkg.toml
[[constraint]]
branch = "master"
name = "C"
接下來 A 項目因為開發的需要在 C 項目中新開了分支。在該分支合并進 master 分支之前,需要在 A 項目的 Gopkg.toml
中指定分支名稱。
[[constraint]]
branch = "master"
name = "B"
[[constraint]]
branch = "new_branch"
name = "C"
這時候再執行 dep ensure
是無法成功的,會提示依賴發生了沖突。
解決沖突的方法也很簡單,在A項目的 Gopkg.toml
中將C項目的constraint
改為 override
就可以了。等到C項目的修改合并進 master 分支時,再將 constraint 改回來。
[[constraint]]
branch = "master"
name = "B"
[[override]]
branch = "new_branch"
name = "C"
constraint 與 override 的區別
dep 會如實得處理 constraint 類型的依賴,在這個例子中,盡管在 A 的依賴中將 C 的分支設置為 new_branch,但是在B項目中,引用的包還是依舊使用 master 分支 的代碼。
如果將A項目的 constraint 改為 override , 則會強制讓 B 項目在拉取 C 項目的代碼時,拉取的是 new_branch 分支上的代碼,避免因為協同開發導致的問題。