Go常用命令之go mod

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:

  1. set GO111MODULE=on //windows
  2. 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共存,所以把GOPATH從env中移出即可(unset GOPATH)拳喻,可運(yùn)行“unset GOPATH && make”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哭当,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冗澈,更是在濱河造成了極大的恐慌钦勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚亲,死亡現(xiàn)場離奇詭異彻采,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捌归,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肛响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惜索,你說我怎么就攤上這事特笋。” “怎么了巾兆?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵猎物,是天一觀的道長。 經(jīng)常有香客問我角塑,道長蔫磨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任圃伶,我火速辦了婚禮堤如,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘留攒。我一直安慰自己煤惩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布炼邀。 她就那樣靜靜地躺著魄揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拭宁。 梳的紋絲不亂的頭發(fā)上洛退,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天瓣俯,我揣著相機(jī)與錄音,去河邊找鬼兵怯。 笑死彩匕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媒区。 我是一名探鬼主播驼仪,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袜漩!你這毒婦竟也來了绪爸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宙攻,失蹤者是張志新(化名)和其女友劉穎奠货,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座掘,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡递惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了溢陪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萍虽。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嬉愧,靈堂內(nèi)的尸體忽然破棺而出贩挣,到底是詐尸還是另有隱情喉前,我是刑警寧澤没酣,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站卵迂,受9級特大地震影響裕便,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜见咒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一偿衰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧改览,春花似錦下翎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庆揩,卻和暖如春俐东,著一層夾襖步出監(jiān)牢的瞬間跌穗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工虏辫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚌吸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓砌庄,卻偏偏與公主長得像羹唠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娄昆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容