您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Go module的使用方法有哪些,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Go1.1.1
版本發布(2018-08-24發布)已經過去幾天,從官方的博客中看到,有兩個比較突出的特色,一個就是今天講的module
,模塊概念。目前該功能還在試驗階段,有些地方還需要不斷的進行完善。在官方正式宣布之前,打算不斷修正這種支持。到時候就可以移除對GOPATH
和go get
命令的支持。
如果你想現在想就試試這個新功能module
,需要你將你的代碼倉庫放到GOPATH/src
目錄之外。然后在那個目錄下創建一個go.mod
文件,從文件樹中運行go
命令。
主要概念介紹
module
是一個相關Go
包的集合,它是源代碼更替和版本控制的單元。模塊由源文件形成的go.mod
文件的根目錄定義,包含go.mod
文件的目錄也被稱為模塊根。moudles
取代舊的的基于GOPATH
方法來指定在工程中使用哪些源文件或導入包。模塊路徑是導入包的路徑前綴,go.mod
文件定義模塊路徑,并且列出了在項目構建過程中使用的特定版本。
go.mod文件
go.mod
文件定義module
路徑以及列出其他需要在build
時引入的模塊的特定的版本。例如下面的例子中,go.mod
聲明example.com/m
路徑時module
的根目錄,同時也聲明了module
依賴特定版本的golang.org/x/text
和gopkg.in/yaml.v2
。
module example.com/m require ( golang.org/x/text v0.3.0 gopkg.in/yaml.v2 v2.1.0 )
go.mod
文件還可以指定要替換和排除的版本,命令行會自動根據go.mod
文件來維護需求聲明中的版本。如果想獲取更多的有關go.mod
文件的介紹,可以使用命令go help go.mod
。go.mod
文件用//
注釋,而不用/**/
。文件的每行都有一條指令,由一個動作加上參數組成。例如:
module my/thing require other/thing v1.0.2 require new/thing v2.3.4 exclude old/thing v1.2.3 replace bad/thing v1.4.5 => good/thing v1.4.5
上面三個動詞require
、exclude
、replace
分別表示:項目需要的依賴包及版本、排除某些包的特別版本、取代當前項目中的某些依賴包。
相同動作的命令可以放到一個動詞+括號組成的結構中,例如:
require ( new/thing v2.3.4 old/thing v1.2.3 )
其他命令的支持
舊的版本,構建編譯命令go build
中的參數沒有-mod
參數,最新的版本現在多了這個,用來對go.mod
文件進行更新或其他使用控制。形式如:go build -mod [mode]
,其中mode有以下幾種取值:readonly
,release
,vendor
。當執行go build -mod=vendor
的時候,會在生成可執行文件的同時將項目的依賴包放到主模塊的vendo
r目錄下。go get -m [packages]
會將下載的依賴包放到GOPATH/pkg/mod
目錄下,并且將依賴寫入到go.mod
文件。go get -u=patch
會更新主模塊下的所有依賴包。
如果遇到不熟悉的導入包,任何可以查找包含該引入包模塊的go
命令,都會自動將該模塊的最新版本添加到go.mod
文件中。同時也會添加缺失的模塊,以及刪除無用的module
。例如:go build
, go test
或者go list
命令。另外,有一個專門的命令go mod tidy
,用來查看和添加缺失的module
需求聲明以及移除不必要的。go.mod
文件是可讀,也是可編輯的。go
命令行會自動更新go.mod
文件來維持一個標準格式以及精確的引入聲明。
Go mod命令
Go mod
提供了一系列操作modules
的命令,記住,所有的go
命令中現在已經內置了對module
的支持,而不僅僅是go mod
命令。例如使用go get
時,會經常自動在后臺添加、移除、升級、降級依賴包版本。
命令語法:go mod <command> [arguments]
。Go mod
提供的命令有下面幾個,對于比較常用的命令進行詳細說明。
download //下載模塊到本地緩存,具體可以通過命令go env查看,其中環境變量GOCACHE就是緩存的地址,如果該文件夾的內容太大,可以通過命令go clean -cache edit //從工具或腳本中編輯go.mod文件 graph //打印模塊需求圖 init //在當前目錄下初始化新的模塊 tidy //添加缺失的模塊以及移除無用的模塊 verify //驗證依賴項是否達到預期的目的 why //解釋為什么需要包或模塊
go mod download
用法:go mod download [-dir] [-json] [modules]
。使用此命令來下載指定的模塊,模塊的格式可以根據主模塊依賴的形式或者path@version
形式指定。如果沒有指定參數,此命令會將主模塊下的所有依賴下載下來。go mod download
命令非常有用,主要用來預填充本地緩存或者計算Go
模塊代理的回答。默認情況下,下載錯誤會輸出到標準輸出,正常情況下沒有任何輸出。-json
參數會以JSON
的格式打印下載的模塊對象,對應的Go
對象結構是這樣。
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]
。此命令會在當前目錄中初始化和創建一個新的go.mod
文件,當然你也可以手動創建一個go.mod
文件,然后包含一些module
聲明,這樣就比較麻煩。go mod init
命令可以幫助我們自動創建,例如:
go mod init example.com/m
使用這條命令時,go.mod
文件必須提前不能存在。初始化會根據引入包聲明來推測模塊的路徑或者如果你工程中之前已經存在一些依賴包管理工具,例如godep
,glide
或者dep
。那么go mod init
同樣也會根據依賴包管理配置文件來推斷。
go mod tidy
默認情況下,Go不會移除go.mod
文件中的無用依賴。所以當你的依賴中有些使用不到了,可以使用go mod tidy
命令來清除它。
用法:go mod tidy [-v]
它會添加缺失的模塊以及移除不需要的模塊。執行后會生成go.sum
文件(模塊下載條目)。添加參數-v
,例如go mod tidy -v
可以將執行的信息,即移除的模塊打印到標準輸出。
go mod vendor
用法:go mod vendor [-v]
,此命令會將build
階段需要的所有依賴包放到主模塊所在的vendor
目錄中,并且測試所有主模塊的包。同理go mod vendor -v
會將添加到vendor
中的模塊打印到標準輸出。
go mod verify
用法:go mod verify
。此命令會檢查當前模塊的依賴是否已經存儲在本地下載的源代碼緩存中,以及檢查自從下載下來是否有修改。如果所有的模塊都沒有修改,那么會打印all modules verified
,否則會打印變化的內容。
虛擬版本號
go.mod文件和go命令通常使用語義版本作為描述模塊版本的標準形式,這樣可以比較不同版本的先后順序。例如模塊的版本是v1.2.3,那么通過重新對版本號進行標簽處理,得到該版本的虛擬版本。形式如:v0.0.0-yyyymmddhhmmss-abcdefabcdef
。其中時間是提交時的UTC時間,最后的后綴是提交的哈希值前綴。時間部分確保兩個虛擬版本號可以進行比較,以確定兩者順序。
下面有三種形式的虛擬版本號:
vX.0.0-yyyymmddhhmmss-abcdefabcdef
,這種情況適合用在在目標版本提交之前 ,沒有更早的的版本。(這種形式本來是唯一的形式,所以一些老的go.mod文件使用這種形式)vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
,這種情況被用在當目標版本提交之前的最新版本提交是vX.Y.Z-pre
vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef
,同理,這種情況是當目標版本提交之前的最新版本是vX.Y.Z
。虛擬版本的生成不需要你去手動操作,go命令會將接收的commit哈希值自動轉化為虛擬版本號。
環境變量——GO111MODULE
Go 1.11中
的module
支持臨時環境變量——GO111MODULE
,它可以設置以下三個值:off
,on
或者auto
(默認)。
GO111MODULE=off
,那么go
命令行將不會使用新的module
功能,相反的,它將會在vendor
目錄下和GOPATH
目錄中查找依賴包。也把這種模式叫GOPATH模式
。GO111MODULE=on
,那么go
命令行就會使用modules
功能,而不會訪問GOPATH
。也把這種模式稱作module-aware
模式,這種模式下,GOPATH
不再在build
時扮演導入的角色,但是盡管如此,它還是承擔著存儲下載依賴包的角色。它會將依賴包放在GOPATH/pkg/mod
目錄下。GO111MODULE=auto
,這種模式是默認的模式,也就是說在你不設置的情況下,就是auto
。這種情況下,go
命令行會根據當前目錄來決定是否啟用module
功能。只有當當前目錄在GOPATH/src
目錄之外而且當前目錄包含go.mod
文件或者其子目錄包含go.mod
文件才會啟用。具體使用步驟:
set GO111MODULE=on
;go mod init
在當前目錄下生成一個go.mod
文件,執行這條命令時,當前目錄不能存在go.mod
文件。go.mod
文件可能就不完整,因此繼續執行下面的命令;go mod tidy
命令,它會添加缺失的模塊以及移除不需要的模塊go.sum
文件(模塊下載條目)。添加參數-v
,例如go mod tidy -v
可以將執行的信息,即刪除和添加的包打印到命令行;go mod verify
來檢查當前模塊的依賴是否全部下載下來,是否下載下來被修改過。如果所有的模塊都沒有被修改過,那么執行這條命令之后,會打印all modules verified
。go mod vendor
生成vendor文件夾,該文件夾下將會放置你go.mod
文件描述的依賴包,文件夾下同時還有一個文件modules.txt
,它是你整個工程的所有模塊。在執行這條命令之前,如果你工程之前有vendor目錄,應該先進行刪除。同理go mod vendor -v
會將添加到vendor中的模塊打印出來;上述就是小編為大家分享的Go module的使用方法有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。