為了解決 go@1.11 前,程式運行被限制於 GOPATH/src 下相依與編譯問題,套件相依管理 go modules 誕生了。先前提到 便是 Go Modules 是否啟用的環境設定值,可分為 on, off, auto 三種。
Golang 專案架構的構築,在某種程度上可以視為 package 的堆疊,若是在多人共同開發的情況下(而且尚未導入CI/CD),團隊成員在本地環境進行編譯,就有可能產生相依套件版本不一致的情形,更糟的是我們可能還不知道哪一個相依版本才是我們想要的,此時 Go Modules 可以解決我們的困擾。
我們在 test 目錄下試試
> export GO111MODULE=on
> go mod init
產出的 go.mod
module test //module path
go 1.15 //go version
套件引用
> go get github.com/bwmarrin/snowflake
go: github.com/bwmarrin/snowflake upgrade => v0.3.0
版本相依後 go.mod
module test
go 1.15
require github.com/bwmarrin/snowflake v0.3.0 // indirect
截至目前為止我們引用了 github.com/bwmarrin/snowflake 這個套件,並且將這個相依的資訊透過 go.mod 記錄下來。我們進行了一次最簡單的相依控管,下一個使用這個專案的團隊成員,即便在 snowflake 這個套件已經更版至 v1.0.0 時,也不會任意的更動套件裡的相依版號。
更版
> go get github.com/bwmarrin/snowflake@v0.2.0
go: downloading github.com/bwmarrin/snowflake v0.2.0
異動紀錄 go.sum
github.com/bwmarrin/snowflake v0.2.0 h1:ldmIc3BQbp6iBoMeAB5BC5lz0NLsYfoNXnFs/fbk62I=
github.com/bwmarrin/snowflake v0.2.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
若要針對特定版號相依,可以透過 git tag 的方式抓取想要的版本 ,並且會被記錄於 go.sum 中留存。最後我們回顧一下上一篇提到的 /pkg 資料夾,在 GO111MODULE=on 的狀況下我們 go get 了不同版本的相同套件,可以在 GOPATH/pkg/mod/ 下找到他們。
> ll $GOPATH/pkg/mod/github.com/bwmarrin
total 0
dr-x------ 7 wesley staff 224B 9 10 21:44 snowflake@v0.2.0
dr-x------ 7 wesley staff 224B 4 23 11:49 snowflake@v0.3.0