Go 語言各個版本支持 Go Modules 的演進史
?01 介紹
Go 語言在 v1.11 開始支持 Modules,本文我們介紹一下 Go 語言各個版本支持 Go Modules 的演進史。
在之前的文章中,我們介紹過 Go Modules 的詳細使用方式,本文不再贅述,感興趣的讀者朋友們請查閱歷史文章。
使用 Go Modules 模式,一般分為以下幾個流程:
- go mod init? 創(chuàng)建一個新模塊,初始化 go.mod 文件。
- go build、go test、go run、go install? 等構建命令,向 go.mod 文件中添加模塊所需的依賴項。
- go list -m -json all 打印當前模塊的依賴項。
- go get 添加依賴項,或修改依賴項版本。
- go mod tidy 刪除未使用的依賴項。
02 Go Modules 演進史
Go v1.11
從 Go v1.11 開始支持 Go Moduls。
為了兼容使用 Go v1.11 之前的任意版本的項目,當設置 GO111MODULE=auto? 或 GO111MODULE=off? 時,Go v1.11 在 $GOPATH/src? 中,繼續(xù)使用 GOPATH 模式。
當設置 GO111MODULE=auto? 時,其它任意位置,如果當前目錄或父目錄包含 go.mod? 文件,則使用 Modules 模式。
注意:GO111MODULE? 包含三個模式,分別是 auto、on 和 off,其中默認值是 auto,即不顯式設置 GO111MODULE 的值,默認是 auto 模式。
Go v1.13
在 Go v1.13? 中,Go Modules 發(fā)生一些變化:
當設置 GO111MODULE=auto? 時,如果在任意位置找到 go.mod? 文件,則使用 Go Modules? 模式,即使在 $GOPATH/src 中。
注意:在 Go v1.13? 之前,即使 GO111MODULE=auto?,在 $GOPATH/src? 目錄中也不會啟動 Go Modules 模式。
go get 的變化:
go get -u (不包含任何參數(shù)),現(xiàn)在只升級當前包的直接和間接依賴,并且不再檢查整個模塊。
go get -u ./... 從模塊根升級模塊的所有直接和間接依賴項,現(xiàn)在排除測試依賴項。
go get -u -t ./... 從模塊根升級模塊的所有直接和間接依賴項,而且還會升級測試依賴項。
Go v1.14
從 Go v1.14 開始,模塊被認為可以用于生產(chǎn)環(huán)境,并且鼓勵所有用戶從其他依賴管理系統(tǒng)遷移到模塊。
當主模塊包含一個頂級 vendor? 目錄,并且它的 go.mod? 文件指定 go 1.14? 或更高版本時,對于支持 -mod=vendor? 的 go? 命令,將默認添加 -mod=vendor。
Go v1.15
模塊緩存的位置現(xiàn)在可以使用 GOMODCACHE? 環(huán)境變量進行設置。GOMODCACHE? 的默認值是 GOPATH[0]/pkg/mod?,這也是不支持使用 GOMODCACHE 環(huán)境變量進行設置之前的模塊緩存的位置。
注意:可以使用 GOPATH 環(huán)境變量設置多個目錄。
Go v1.16
模塊模式(GO111MODULE=on?)默認開啟,也就是說默認啟用 Go Modules? 模式,如果用戶想要使用 GOPATH? 模式,需要顯式設置 GO111MODULE=off? 或 GO111MODULE=auto?(并且需要在 $GOPATH/src 目錄)。
使用 go install pkg@version? 替換 go get pkg@version 全局安裝包和可執(zhí)行文件。
注意:在 Modules? 模式 go get? 不再用于構建或安裝包,而是專門用于調(diào)整 go.mod? 中的依賴項,如果在模塊外執(zhí)行 go get? 將會報錯,因為沒有可更新的 go.mod? 文件;在 GOPATH? 模式(GO111MODULE=off?) go get 仍然構建和安裝包。
03 總結
本文我們介紹 Go Modules 模式在 Go 語言各個版本中的演進史,限于篇幅,僅介紹的在使用時常用操作的變化,我們最后做一下總結:
從 Go v1.11? 開始支持 Go Modules? 模式,Go v1.13? 在(包含 $GOPATH/src? )任意目錄找到 go.mod? 文件,都開啟 Go Modules? 模式, Go v1.14? 推薦在生產(chǎn)環(huán)境使用,Go v1.16? 默認開啟 Go Modules 模式。