Go mod
Go mod 的三種開啟模式
- GO111MODULE
- on:支持Go mod模式
- off:不支持Go mod模式
- auto (默認(rèn)模式):如果代碼在gopath下,則自動使用gopath模式葵擎;如果代碼不在gopath下香浩,則自動使用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ù)需要自動下載模塊。go mod download
的作用主要是預(yù)填充本地緩存或者計算Go模塊代理的結(jié)果。
默認(rèn)情況下go mod download
不向標(biāo)準(zhǔn)輸出寫入內(nèi)容(可能會打印進(jìn)度信息和錯誤日志)膜蛔。
標(biāo)志:
-
-json
:打印一系列JSON對象至標(biāo)準(zhǔn)輸出坛猪,描述每個下載的模塊。 -
-x
:打印實(shí)際需要執(zhí)行的命令皂股,并運(yùn)行墅茉。
edit
范式:go mod edit [editing flags] [go.mod]
作用:edit提供一個編輯go.mod的命令行接口,主要提供給工具或腳本使用屑墨。它只讀取go.mod;不查找涉及模塊的信息纷铣。默認(rèn)情況下卵史,edit讀寫主模塊的go.mod文件,但也可以在標(biāo)志后指定不同的目標(biāo)文件搜立。
標(biāo)志:
-dropexclude=path@version
:刪除給定模塊路徑和版本的排除項以躯。-dropreplace=old[@v]
:刪除給定模塊路徑和版本的替代。如果@v省略啄踊,刪除該模塊不帶版本的替代忧设。-droprequire=path
:刪除給定的模塊路徑依賴要求的模塊。該標(biāo)志主要提供給工具用以理解模塊圖颠通。用戶應(yīng)該使用“go get path@none”址晕,可令其它go.mod根據(jù)需要調(diào)整來滿足其它模塊施加的限制。-exclude=path@version
:添加給定模塊路徑和版本的排除項顿锰。注意如果排除項已經(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)系圖氓英。輸出的每一行行有兩個字段(通過空格分割)侯勉;模塊和其所有依賴中的一個。每個模塊都被標(biāo)記為path@version形式的字符串(除了主模塊铝阐,因其沒有@version后綴)偏螺。
init
范式: go mod init [module]
作用:初始化并寫入一個新的go.mod至當(dāng)前目錄中贸诚,實(shí)際上是創(chuàng)建一個以當(dāng)前目錄為根的新模塊炎咖。文件go.mod必須不存在央碟。如果可能,init會從import注釋(參閱“go help importpath”)或從版本控制配置猜測模塊路徑吹害。要覆蓋此猜測螟凭,提供模塊路徑作為參數(shù) module
為當(dāng)前項目名
tidy
范式:go mod tidy [-v]
作用:確保go.mod與模塊中的源代碼一致。它添加構(gòu)建當(dāng)前模塊的包和依賴所必須的任何缺少的模塊它呀,刪除不提供任何有價值的包的未使用的模塊螺男。它也會添加任何缺少的條目至go.mod并刪除任何不需要的條目棒厘。
標(biāo)志:
-
-v
:打印被刪除的模塊的信息至標(biāo)準(zhǔn)錯誤輸出。
vendor
范式:go mod vendor [-v]
作用:重置主模塊的vendor目錄下隧,使其包含構(gòu)建和測試所有主模塊的包所需要的所有包奢人。不包括vendor中的包的測試代碼。
標(biāo)志:
-
-v
:打印vendor的模塊和包的名字至標(biāo)準(zhǔn)錯誤輸出淆院。
verify
范式:go mod verify
作用:檢查存儲在本地下載源代碼緩存中的當(dāng)前模塊的依賴何乎,是否自從下載之后未被修改。如果所有模塊都未被修改土辩,打印“all modules verified”支救。否則,報告哪個模塊已經(jīng)被修改并令“go mod”以非0狀態(tài)退出拷淘。
why
范式:go mod why [-m] [-vendor] packages...
作用:輸出每個包或者模塊的引用塊各墨,每個塊以注釋行“# package”或“# module”開頭,給出目標(biāo)包或模塊辕棚。隨后的行通過導(dǎo)入圖給出路徑欲主,一個包一行邓厕。每個塊之間通過一個空行分割逝嚎,如果包或模塊沒有被主模塊引用,該小節(jié)將顯示單獨(dú)一個帶圓括號的提示信息來表明該事實(shí)详恼。
標(biāo)志:
-
-m
:默認(rèn)情況下补君,why在導(dǎo)入圖中展示從主模塊到每個列出的包的最短路徑。如果給出-m標(biāo)志昧互,why將參數(shù)視為一個模塊的列表并找出每個模塊中的所有包的路徑挽铁。 -
-vendor
:默認(rèn)情況下,why查詢與“go list all”匹配的包圖敞掘,包括對可達(dá)包的測試相關(guān)的包叽掘。-vendor標(biāo)志令why將依賴包的測試相關(guān)的包排除在外。
go.mod文件
? 模塊版本是由源文件樹定義的玖雁,在其根目錄中有一個go.mod文件更扁。當(dāng)go命令運(yùn)行時,它查找當(dāng)前目錄然后查找相繼的父目錄來找出go.mod赫冬,go.mod標(biāo)記主模塊的根浓镜。
go.mod文件自身是面向行的,帶有//
注釋但沒有/**/
注釋劲厌。每行包含單個指令膛薛,有一個動詞后跟參數(shù)組成。
動詞類型:
- module:定義模塊路徑补鼻。
- go:設(shè)置期望的語言版本哄啄。
- require:依賴要求一個給定版本或者之后的特定模塊雅任。
- exclude:從使用中排除特定模塊版本。
- replace:以一個不同的增淹,模塊版呢嘛提到另一個模塊版本椿访。
exclude和replace只應(yīng)用在主模塊的go.mod中,并且在依賴中會被忽略虑润。
常見錯誤匯總
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 //windows
export GO111MODULE=on //linux
$GOPATH/go.mod exists but should not
GO 1.11或之后模塊遇到這個問題:
$GOPATH/go.mod exists but should not
開啟模塊支持后(set GO111MODULE=on)成玫,并不能與GOPATH從env中移出即可(unset GOPATH)拳喻,可運(yùn)行“unset GOPATH && make”