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