golang版本管理工具GO111MODULE

在go1.11版本前,想要對go語言包進行管理,只能依賴第三方庫實現,好比Vendor,GoVendor,GoDep,Dep,Glide等等。html

1. 開啓GO111MODULE

用環境變量 GO111MODULE 開啓或關閉模塊支持,它有三個可選值:offonauto,默認值是 autogit

  • 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

2. 定義module

模塊根目錄和其子目錄的全部包構成模塊,在根目錄下存在 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 buildgo testgo list 命令時會根據須要的依賴自動生成 require 語句。code

官方建議常常維護這個文件,保持依賴項是乾淨的。對於國內用戶來講,手動維護這個文件是必然的,由於你須要把 golang.org/x/text 替換成 github.com/golang/text 。htm

3. 相關命令

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 完整版本的寫法。

v1v1.2 匹配帶這個前綴的最新版本,若是最新版是 1.2.7,它們會匹配 1.2.7

c856192 版本 hash 前綴、分支名、無語義化的標籤,在 go.mod 裏都會會使用約定寫法 v0.0.0-20180517173623-c85619274f5d,也被稱做僞版本。

go get 能夠模糊匹配版本號,但 go.mod 文件只體現完整的版本號,即 v1.2.0v0.0.0-20180517173623-c85619274f5d,只不過不須要手寫這麼長的版本號,用 go get 或上文的 go mod -require 模糊匹配便可,它會把匹配到的完整版本號寫進 go.mod 文件。

go build 命令

go build -getmode=vendor 在開啓模塊支持的狀況下,用這個能夠退回到使用 vendor 的時代。

 

參考:

1. 用 golang 1.11 module 作項目版本管理

2. Go 1.11 Module全攻略

相關文章
相關標籤/搜索