關於go module

從Go 1.11開始引入module,用於版本管理。

通過使用module,工程目錄的位置不用必須放在GOPATH下。

當前版本是1.13,下文中將以Go1.13爲例介紹module。

在Go 1.13中,繼續使用臨時環境變量GO111MODULE來設置是否使用module。

1.關於GO111MODULE

GO111MODULE 可設置爲off, on, 或auto (默認)。

1.1 GO111MODULE=on

如果GO111MODULE=on, go command 將使用modules查找依賴包,不再使用GOPATH。一般稱爲"module-aware mode"。
在module-aware mode下,GOPATH 是無意義的,不過它還是會把下載的依賴包存儲在 $GOPATH/pkg/mod 中,也會把 go install 的結果放在 $GOPATH/bin 中(如果GOBIN沒有設置)。

使用module的情況下,執行go commands(go build, go test …等),自動添加依賴到go.mod中。

1.2 GO111MODULE=off

如果 GO111MODULE=off,go command不再使用module查找依賴包,而是在vendor目錄和GOPATH查找依賴包。一般稱爲"GOPATH mode."

1.3 GO111MODULE=auto 或沒有設置

如果 GO111MODULE=auto 或沒有設置, go command是否使用module取決於是否存在go.mod文件。
如果當前目錄,或父目錄中存在go.mod文件,那麼go command就會使用module,否則不會使用module。

特別說明下,
在Go 1.13中,如果GO111MODULE=auto或沒有設置,並且只要有 go.mod 文件,就會使用module, 甚至即使在GOPATH下,也一樣。
Go 1.13以前, 如果在GOPATH下,即使GO111MODULE=auto或沒有設置,也無法使用module。

2.Modules 與 vendoring

當使用modules的時候,go command 會自動下載依賴包(存放路徑GOPATH/pkg/mod),並會完全忽略vendor目錄。

爲了與老版本的Go兼容,或者想把所有的依賴包放在一個目錄下,go語言提供了 ‘go mod vendor’ 。
使用 ‘go mod vendor’ ,可以在主module下的根目錄下創建一個名爲’vendor’目錄,裏面存放所有的go build、go test使用的依賴包。

編譯時,使用’go build -mod=vendor’,這樣就會使用vendor目錄的依賴包,而不再使用網絡和本地緩存。
這裏vendor目錄必須是主module的頂級vendor目錄,其他位置的vendor目錄會被忽略。

3.參考

Module support

Modules

How do I use vendoring with modules? Is vendoring going away?

發佈了471 篇原創文章 · 獲贊 170 · 訪問量 208萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章