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