php小編小新解答為什么在使用”go get -u”命令時會下載同一個包的兩個版本。這個問題的原因在于go mod的工作原理。go mod是Go語言在1.11版本引入的依賴管理工具,它會根據項目的go.mod文件自動下載和管理依賴包。當我們使用”go get -u”命令時,它會檢查go.mod文件中的依賴包版本,并嘗試下載最新的版本。然而,有些包的版本更新可能會依賴于其他包的不同版本,因此go mod會下載兩個版本的包以滿足依賴關系,這就是為什么會下載同一個包的兩個版本的原因。
問題內容
我使用 go get -u
來獲取依賴于 golang.org/x/[email?protected]
的軟件包。我注意到它首先下載 golang.org/x/[email?protected]
然后下載 golang.org/x/[email?protected]
。
然后我運行 go clean -modcache
和 go get golang.org/x/text
,它下載了 golang.org/x/text
的 v0.4.0
,然后再次 go get -u entgo.io/ent
。這次 go 沒有下載 golang.org/x/[email?protected]
那么,為什么 go get -u
在本地沒有最新版本時同時下載舊版本和最新版本,以及為什么在本地有最新版本時它不下載舊版本?
解決方法
因為這是一個兩步過程
-
獲取依賴項
更新依賴項
從編程的角度來看,沒有充分的理由將這些合并到“獲取最新依賴項”的單一關注點中。
來自 go 命令文檔:
-u 標志指示 get 更新提供命令行上命名的包的依賴項的模塊,以便在可用時使用較新的次要版本或補丁版本。
這意味著 -u
專門處理您所獲取的包所依賴的模塊,而不是您所獲取的包的模塊。
此外,似乎 -u
與將 v0
版本中的任何更改視為主要版本更改的 Go 慣用法無關,因此不能出于原則輕易推薦使用 -u
。 golang.org/x/test 的自述文件甚至說:
在 x/text 版本達到 1.0.0 之前,次要版本被視為主要版本。因此從 0.1.0 到 0.2.0 被認為是一個主要版本的提升。