在go1.11版本前,想要對go語言包進行管理,只能依賴第三方庫實現,好比Vendor,
GoVendor,
GoDep,
Dep,
Glide
等等。html
用環境變量 GO111MODULE
開啓或關閉模塊支持,它有三個可選值:off
、on
、auto
,默認值是 auto
。git
GO111MODULE=off
無模塊支持,go 會從 GOPATH 和 vendor 文件夾尋找包。GO111MODULE=on
模塊支持,go 會忽略 GOPATH 和 vendor 文件夾,只根據 go.mod
下載依賴。GO111MODULE=auto
在 $GOPATH/src
外面且根目錄有 go.mod
文件時,開啓模塊支持。在使用模塊的時候,GOPATH
是無心義的,不過它仍是會把下載的依賴儲存在 $GOPATH/src/mod
中,也會把 go install
的結果放在 $GOPATH/bin
中。github
模塊根目錄和其子目錄的全部包構成模塊,在根目錄下存在 go.mod
文件,子目錄會向着父目錄、爺目錄一直找到 go.mod
文件。golang
模塊路徑指模塊根目錄的導入路徑,也是其餘子目錄導入路徑的前綴。ide
go.mod
文件第一行定義了模塊路徑,有了這一行纔算做是一個模塊。ui
go.mod
文件接下來的篇幅用來定義當前模塊的依賴和依賴版本,也能夠排除依賴和替換依賴。spa
module example.com/m require ( golang.org/x/text v0.3.0 gopkg.in/yaml.v2 v2.1.0 ) replace ( golang.org/x/text => github.com/golang/text v0.3.0 )
這個文件不用手寫,能夠用 go mod init example.com/m
生成 go.mod
的第一行,文件的剩餘部分也不用擔憂,在執行 go build
、go test
、go list
命令時會根據須要的依賴自動生成 require
語句。code
官方建議常常維護這個文件,保持依賴項是乾淨的。對於國內用戶來講,手動維護這個文件是必然的,由於你須要把 golang.org/x/text
替換成 github.com/golang/text
。htm
go list 命令blog
go list -m
能夠查看當前的依賴和版本
go mod 命令
這個子命令用來處理 go.mod
文件。
download download modules to local cache
edit edit go.mod from tools or scripts
graph print module requirement graph
init initialize new module in current directory
tidy add missing and remove unused modules
vendor make vendored copy of dependencies
verify verify dependencies have expected content
why explain why packages or modules are needed
go get 命令
獲取依賴的特定版本,用來升級和降級依賴。能夠自動修改 go.mod
文件,並且依賴的依賴版本號也可能會變。在 go.mod
中使用 exclude
排除的包,不能 go get
下來。
與之前不一樣的是,新版 go get
能夠在末尾加 @
符號,用來指定版本。
它要求倉庫必須用 v1.2.0
格式打 tag,像 v1.2
少個零都不行的,必須是語義化的、帶 v
前綴的版本號。
go get github.com/gorilla/mux # 匹配最新的一個 tag go get github.com/gorilla/mux@latest # 和上面同樣 go get github.com/gorilla/mux@v1.6.2 # 匹配 v1.6.2 go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2 go get github.com/gorilla/mux@c856192 # 匹配 c85619274f5d go get github.com/gorilla/mux@master # 匹配 master 分支
latest
匹配最新的 tag。
v1.2.6
完整版本的寫法。
v1
、v1.2
匹配帶這個前綴的最新版本,若是最新版是 1.2.7
,它們會匹配 1.2.7
。
c856192
版本 hash 前綴、分支名、無語義化的標籤,在 go.mod
裏都會會使用約定寫法 v0.0.0-20180517173623-c85619274f5d
,也被稱做僞版本。
go get
能夠模糊匹配版本號,但 go.mod
文件只體現完整的版本號,即 v1.2.0
、v0.0.0-20180517173623-c85619274f5d
,只不過不須要手寫這麼長的版本號,用 go get
或上文的 go mod -require
模糊匹配便可,它會把匹配到的完整版本號寫進 go.mod
文件。
go build 命令
go build -getmode=vendor
在開啓模塊支持的狀況下,用這個能夠退回到使用 vendor 的時代。
參考: