從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.參考
How do I use vendoring with modules? Is vendoring going away?