Go常用命令之go mod

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:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容