Go mod
Go mod 的三種開啟模式
- GO111MODULE
- on:支持Go mod模式
- off:不支持Go mod模式
- auto (默認(rèn)模式):如果代碼在gopath下,則自動(dòng)使用gopath模式;如果代碼不在gopath下,則自動(dòng)使用GO mod模式。
- 開啟方式:
- Windows中,在環(huán)境變量中添加變量即可,變量名為 GO111MODULE ,變量值可設(shè)置為 on、off、auto。
- Linux中,只要在 /etc/profile 中添加 export GO111MODULE=on 或 export GO111MODULE=off 或 export GO111MODULE=auto。然后執(zhí)行 source /etc/profile 刷新即可。
范式
go mod <command> [arguments]
command命令
download
范式: go download [-x] [-json] [modules]
作用:下載指定名字的模塊,可為選擇主模塊依賴的模塊匹配模式,或path@version形式的模塊查詢。如果download不帶參數(shù)則代表英語與是主模塊的所有依賴。
go命令將在常規(guī)執(zhí)行(編譯、調(diào)試等等)期間根據(jù)需要自動(dòng)下載模塊。go mod download的作用主要是預(yù)填充本地緩存或者計(jì)算Go模塊代理的結(jié)果。
默認(rèn)情況下go mod download 不向標(biāo)準(zhǔn)輸出寫入內(nèi)容(可能會打印進(jìn)度信息和錯(cuò)誤日志)。
標(biāo)志:
-
-json:打印一系列JSON對象至標(biāo)準(zhǔn)輸出,描述每個(gè)下載的模塊。 -
-x:打印實(shí)際需要執(zhí)行的命令,并運(yùn)行。
edit
范式:go mod edit [editing flags] [go.mod]
作用:edit提供一個(gè)編輯go.mod的命令行接口,主要提供給工具或腳本使用。它只讀取go.mod;不查找涉及模塊的信息。默認(rèn)情況下,edit讀寫主模塊的go.mod文件,但也可以在標(biāo)志后指定不同的目標(biāo)文件。
標(biāo)志:
-dropexclude=path@version:刪除給定模塊路徑和版本的排除項(xiàng)。-dropreplace=old[@v]:刪除給定模塊路徑和版本的替代。如果@v省略,刪除該模塊不帶版本的替代。-droprequire=path:刪除給定的模塊路徑依賴要求的模塊。該標(biāo)志主要提供給工具用以理解模塊圖。用戶應(yīng)該使用“go get path@none”,可令其它go.mod根據(jù)需要調(diào)整來滿足其它模塊施加的限制。-exclude=path@version:添加給定模塊路徑和版本的排除項(xiàng)。注意如果排除項(xiàng)已經(jīng)存在-exclude=path@version是無操作的。-fmt:重新格式化go.mod文件,不作其他改變。使用或重寫go.mod文件的任何其他修改也意味著這種重新格式化。需要該標(biāo)志的唯一情形是沒有指定其它標(biāo)志,如“go mod edit -fmt”。-go=version:設(shè)置期望的Go語言版本。-
-json:以JSON格式打印最終的go.mod,而不是將其寫回go.mod。JSON輸出對應(yīng)于這些Go類型:type Module struct { Path string Version string } type GoMod struct { Module Module Go string Require []Require Exclude []Module Replace []Replace } type Require struct { Path string Version string Indirect bool } type Replace struct { Old Module New Module } -module:修改模塊路徑(go.mod文件的模塊行)。-print:以其文本格式打印最終的go.mod,而不是將其寫回go.mod。-replace=old[@v]=new[@v]:添加給定模塊路徑和版本對的替代。如果old@v中的@v省略,則左側(cè)不帶版本的替代將被添加,應(yīng)用于old模塊路徑的所有版本。如果new@v中的@v省略,新路徑應(yīng)為本地模塊根目錄,而不是模塊路徑。注意-replace覆蓋old[@v]任何冗余的替代,因此省略@v將刪除對特定版本的現(xiàn)有替代。-require=path@version:添加給定的模塊路徑和版本依賴要求的模塊。注意-require覆蓋該路徑任何已存在的依賴要求的模塊。該標(biāo)志主要提供給工具用以理解模塊圖。用戶應(yīng)該使用“go get path@version”,其可令其它go.mod根據(jù)需要調(diào)整來滿足其它模塊施加的限制。
-require、-droprequire、-exclude、-dropexclude、-replace、-dropreplace標(biāo)志可以重復(fù),根據(jù)給定的順序應(yīng)用修改。
注意這只描述go.mod文件自身,不描述其他間接引用的模塊。對于構(gòu)建可使用的的模塊的完整集合,使用“go list -m -json all”。
例如,工具可以通過解析“go mod edit -json”的輸出以數(shù)據(jù)結(jié)構(gòu)體的方式獲取go.mod,然后可通過使用-require、-exclude等調(diào)用“go mod edit”來作出修改,等等。
graph
范式:go mod graph
作用:以文本形式打印模塊間的依賴關(guān)系圖。輸出的每一行行有兩個(gè)字段(通過空格分割);模塊和其所有依賴中的一個(gè)。每個(gè)模塊都被標(biāo)記為path@version形式的字符串(除了主模塊,因其沒有@version后綴)。
init
范式: go mod init [module]
作用:初始化并寫入一個(gè)新的go.mod至當(dāng)前目錄中,實(shí)際上是創(chuàng)建一個(gè)以當(dāng)前目錄為根的新模塊。文件go.mod必須不存在。如果可能,init會從import注釋(參閱“go help importpath”)或從版本控制配置猜測模塊路徑。要覆蓋此猜測,提供模塊路徑作為參數(shù) module為當(dāng)前項(xiàng)目名
tidy
范式:go mod tidy [-v]
作用:確保go.mod與模塊中的源代碼一致。它添加構(gòu)建當(dāng)前模塊的包和依賴所必須的任何缺少的模塊,刪除不提供任何有價(jià)值的包的未使用的模塊。它也會添加任何缺少的條目至go.mod并刪除任何不需要的條目。
標(biāo)志:
-
-v:打印被刪除的模塊的信息至標(biāo)準(zhǔn)錯(cuò)誤輸出。
vendor
范式:go mod vendor [-v]
作用:重置主模塊的vendor目錄,使其包含構(gòu)建和測試所有主模塊的包所需要的所有包。不包括vendor中的包的測試代碼。
標(biāo)志:
-
-v:打印vendor的模塊和包的名字至標(biāo)準(zhǔn)錯(cuò)誤輸出。
verify
范式:go mod verify
作用:檢查存儲在本地下載源代碼緩存中的當(dāng)前模塊的依賴,是否自從下載之后未被修改。如果所有模塊都未被修改,打印“all modules verified”。否則,報(bào)告哪個(gè)模塊已經(jīng)被修改并令“go mod”以非0狀態(tài)退出。
why
范式:go mod why [-m] [-vendor] packages...
作用:輸出每個(gè)包或者模塊的引用塊,每個(gè)塊以注釋行“# package”或“# module”開頭,給出目標(biāo)包或模塊。隨后的行通過導(dǎo)入圖給出路徑,一個(gè)包一行。每個(gè)塊之間通過一個(gè)空行分割,如果包或模塊沒有被主模塊引用,該小節(jié)將顯示單獨(dú)一個(gè)帶圓括號的提示信息來表明該事實(shí)。
標(biāo)志:
-
-m:默認(rèn)情況下,why在導(dǎo)入圖中展示從主模塊到每個(gè)列出的包的最短路徑。如果給出-m標(biāo)志,why將參數(shù)視為一個(gè)模塊的列表并找出每個(gè)模塊中的所有包的路徑。 -
-vendor:默認(rèn)情況下,why查詢與“go list all”匹配的包圖,包括對可達(dá)包的測試相關(guān)的包。-vendor標(biāo)志令why將依賴包的測試相關(guān)的包排除在外。
go.mod文件
? 模塊版本是由源文件樹定義的,在其根目錄中有一個(gè)go.mod文件。當(dāng)go命令運(yùn)行時(shí),它查找當(dāng)前目錄然后查找相繼的父目錄來找出go.mod,go.mod標(biāo)記主模塊的根。
go.mod文件自身是面向行的,帶有//注釋但沒有/**/注釋。每行包含單個(gè)指令,有一個(gè)動(dòng)詞后跟參數(shù)組成。
動(dòng)詞類型:
- module:定義模塊路徑。
- go:設(shè)置期望的語言版本。
- require:依賴要求一個(gè)給定版本或者之后的特定模塊。
- exclude:從使用中排除特定模塊版本。
- replace:以一個(gè)不同的,模塊版呢嘛提到另一個(gè)模塊版本。
exclude和replace只應(yīng)用在主模塊的go.mod中,并且在依賴中會被忽略。
常見錯(cuò)誤匯總
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
go mod init
go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'
開啟go module:
set GO111MODULE=on //windowsexport GO111MODULE=on //linux
$GOPATH/go.mod exists but should not
GO 1.11或之后模塊遇到這個(gè)問題:
$GOPATH/go.mod exists but should not
開啟模塊支持后(set GO111MODULE=on),并不能與GOPATH從env中移出即可(unset GOPATH),可運(yùn)行“unset GOPATH && make”