GO111MODULE 說明


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

1. 開啟GO111MODULE

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

  • 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 中。

2. 定義module

模塊根目錄和其子目錄的所有包構成模塊,在根目錄下存在 go.mod 文件,子目錄會向着父目錄、爺目錄一直找到 go.mod 文件。

模塊路徑指模塊根目錄的導入路徑,也是其他子目錄導入路徑的前綴。

go.mod 文件第一行定義了模塊路徑,該模塊的子目錄都相對於該地址。若go程序需要應用子模塊,則直接導入go.mod中模塊地址+子目錄

go.mod 文件接下來的篇幅用來定義當前模塊的依賴和依賴版本,也可以排除依賴和替換依賴。

復制代碼
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 語句。

官方建議經常維護這個文件,保持依賴項是干凈的。對於國內用戶來說,手動維護這個文件是必然的,因為你需要把 golang.org/x/text 替換成 github.com/golang/text 。

3. 相關命令

go list 命令

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 的時代。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM