Go 1.11 moudel 介绍
引入moudle的目的
引入moudle模塊,取代了老版本中依賴GOPATH來(lái)制定工程中使用哪些源文件或?qū)氚姆绞健?/p>
什么是moudle
屬于go包管理工具的一種,是相關(guān)go包的集合,源代碼更替和版本控制的單元。
如何開(kāi)啟module功能
首先,需要申明的是1.11以上版本的所有g(shù)o命令已經(jīng)內(nèi)置了對(duì)module的支持,例如,使用go get時(shí),也會(huì)自動(dòng)在后臺(tái)添加、移除、升級(jí)、降級(jí)依賴庫(kù)版本。
使用module功能需要設(shè)置環(huán)境變量GO111MODULE。
export GO111MODLE=on
GO111MODULE的三個(gè)選項(xiàng):
- GO111MODULE=off 使用GOPATH模式,即在GOPATH下查找依賴項(xiàng);
- GO111MODULE=on 使用module模式;
- GO111MODULE=auto 默認(rèn)模式,會(huì)根據(jù)當(dāng)前存在的目錄來(lái)確定使用哪一種模式,只有當(dāng)目錄不在GOPATH/src目錄并且存在go.mod文件的時(shí)候會(huì)選用MODULE模式;
go.mod 文件
(備注:可以使用go help go.mod 命令了解更多關(guān)于go.mod的信息)
- 定義模塊路徑,并列出相關(guān)使用版本;
- 屬于line-oriented, 只能用 // 注釋;
- 包含指令:
module my/thing //root module
require other/thing v1.0.2 //項(xiàng)目需要依賴的包及版本
exclude old/thing v1.2.3 //需要排除的特殊版本
replace bad/thing v1.4.5 => good/thing v1.4.5 //需要代替的版本
相同命令可以省略命令,如下組織
require(
)
go mod命令
命令語(yǔ)法:go mod [arguments]。Go mod提供的命令有下面幾個(gè),對(duì)于比較常用的命令進(jìn)行詳細(xì)說(shuō)明。
download //下載模塊到本地緩存,具體可以通過(guò)命令go env查看,其中環(huán)境變GOCACHE就是緩存的地址,如果該文件夾的內(nèi)容太大,可以通過(guò)命令go clean -cache
edit //從工具或腳本中編輯go.mod文件
graph //打印模塊需求圖
init //在當(dāng)前目錄下初始化新的模塊
tidy //添加缺失的模塊以及移除無(wú)用的模塊
verify //驗(yàn)證依賴項(xiàng)是否達(dá)到預(yù)期的目的
why //解釋為什么需要包或模塊
go mod download
用法:go mod download [-dir] [-json] [modules]。使用此命令來(lái)下載指定的模塊,模塊的格式可以根據(jù)主模塊依賴的形式或者path@version形式指定。如果沒(méi)有指定參數(shù),此命令會(huì)將主模塊下的所有依賴下載下來(lái)。
go mod download命令非常有用,主要用來(lái)預(yù)填充本地緩存或者計(jì)算Go模塊代理的回答。默認(rèn)情況下,下載錯(cuò)誤會(huì)輸出到標(biāo)準(zhǔn)輸出,正常情況下沒(méi)有任何輸出。-json參數(shù)會(huì)以JSON的格式打印下載的模塊對(duì)象,對(duì)應(yīng)的Go對(duì)象結(jié)構(gòu)是這樣。
type Module struct {
Path string //module path
Version string //module version
Error string //error loading module
Info string //absolute path to cached .info file
GoMod string //absolute path to cached .mod file
Zip string //absolute path to cached .zip file
Dir string //absolute path to cached source root directory
Sum string //checksum for path, version (as in go.sum)
GoModSum string //checksum for go.mod (as in go.sum)
}
go mod init
用法:go mod init [module]。此命令會(huì)在當(dāng)前目錄中初始化和創(chuàng)建一個(gè)新的go.mod文件,當(dāng)然你也可以手動(dòng)創(chuàng)建一個(gè)go.mod文件,然后包含一些module聲明,這樣就比較麻煩。go mod init命令可以幫助我們自動(dòng)創(chuàng)建,例如:
go mod init example.com/m
使用這條命令時(shí),go.mod文件必須提前不能存在。初始化會(huì)根據(jù)引入包聲明來(lái)推測(cè)模塊的路徑或者如果你工程中之前已經(jīng)存在一些依賴包管理工具,例如godep,glide或者dep。那么go mod init同樣也會(huì)根據(jù)依賴包管理配置文件來(lái)推斷。
go mod tidy
默認(rèn)情況下,Go不會(huì)移除go.mod文件中的無(wú)用依賴。所以當(dāng)你的依賴中有些使用不到了,可以使用go mod tidy命令來(lái)清除它。
用法:go mod tidy [-v]它會(huì)添加缺失的模塊以及移除不需要的模塊。執(zhí)行后會(huì)生成go.sum文件(模塊下載條目)。添加參數(shù)-v,例如go mod tidy -v可以將執(zhí)行的信息,即移除的模塊打印到標(biāo)準(zhǔn)輸出。
go mod vendor
用法:go mod vendor [-v],此命令會(huì)將build階段需要的所有依賴包放到主模塊所在的vendor目錄中,并且測(cè)試所有主模塊的包。同理go mod vendor -v會(huì)將添加到vendor中的模塊打印到標(biāo)準(zhǔn)輸出。
go mod verify
用法:go mod verify。此命令會(huì)檢查當(dāng)前模塊的依賴是否已經(jīng)存儲(chǔ)在本地下載的源代碼緩存中,以及檢查自從下載下來(lái)是否有修改。如果所有的模塊都沒(méi)有修改,那么會(huì)打印all modules verified,否則會(huì)打印變化的內(nèi)容。
虛擬版本號(hào)
go.mod文件和go命令通常使用語(yǔ)義版本作為描述模塊版本的標(biāo)準(zhǔn)形式,這樣可以比較不同版本的先后順序。例如模塊的版本是v1.2.3,那么通過(guò)重新對(duì)版本號(hào)進(jìn)行標(biāo)簽處理,得到該版本的虛擬版本。如:
v0.0.0-yyyymmddhhmmss-abcdefabcdef。
其中時(shí)間是提交時(shí)的UTC時(shí)間,
最后的后綴是提交的哈希值前綴;
時(shí)間部分確保兩個(gè)虛擬版本號(hào)可以進(jìn)行比較,以確定兩者順序。
下面有三種形式的虛擬版本號(hào):
vX.0.0-yyyymmddhhmmss-abcdefabcdef,
這種情況適合用在在目標(biāo)版本提交之前 ,沒(méi)有更早的的版本。(這種形式本來(lái)是唯一的形式,所以一些老的go.mod文件使用這種形式)
vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef,
這種情況被用在當(dāng)目標(biāo)版本提交之前的最新版本提交是vX.Y.Z-pre
vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef,這種情況是當(dāng)目標(biāo)版本提交之前的最新版本是vX.Y.Z
虛擬版本的生成不需要你去手動(dòng)操作,go命令會(huì)將接收的commit哈希值自動(dòng)轉(zhuǎn)化為虛擬版本號(hào)。
總結(jié)
以上是生活随笔為你收集整理的Go 1.11 moudel 介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql gb2312转utf8_如何
- 下一篇: 接私活可用的 Springboot +