這世上太多的人,寧願吃生活苦,也不肯吃自律的苦。大概是由於生活的苦,躺着就來了,而自律的苦,得本身去找。但只有吃得下自律的苦,纔有成功的自由,沒有一種成功是走得了捷徑的,通向真正成功的惟一道路只有自律。越成功,越自律。越自律,越成功。
GO111MODULE
Go 1.1
包含了對Go Modules
的預支持,包括調整後的go get
命令。後續版本總GOPATH
和老的go get
可能會被官方移除。git
在Go Modules
中支持了一個臨時環境變量:GO111MODULE
,能夠賦值爲off
、on
或auto
。github
off
,表示不支持Go Modules
模式,Go
仍然在vendor
和GoPATH
路徑下查找依賴;on
,表示當前明確使用Go Modules
,Go
再也不去GOPATH
下查找任何依賴;auto
或未設置,表示是否啓用Go Modules
依賴當前的目錄狀況,當編譯的項目在GoPATH/src
以外,或者當前目錄或子目錄自己包含go.mod
文件,則啓用Go Modules
模式。Defining a module
module
經過源碼根目錄下的go.mod
文件來定義。根路徑下的module
是項目依賴包的集合,但會排除子目錄的go.mod
文件。golang
下面是go mod
文件模版:shell
module example.com/m require ( golang.org/x/text v0.3.0 gopkg.in/yaml.v2 v2.1.0 )
要開始使用go mod
,僅須要在項目下執行go mod init
命令建立go.mod
文件便可。gitlab
go mod init example.com/m
The go.mod File
go.mod
文件的每一行都包還一個簡單的指令(module
、require
、exclude
、replace
),而後緊跟參數部分。指令除了單行表示以外,還能夠是一個塊的形式。其中,文件也是以//
做爲註釋符。ui
下面是截取我項目下的go.mod
文件的部份內容:google
module gitlab.luojilab.com/igetserver/order_delivery go 1.12 require ( github.com/Shopify/sarama v1.22.1 github.com/bsm/sarama-cluster v2.1.15+incompatible github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect ) replace ( cloud.google.com/go => github.com/GoogleCloudPlatform/google-cloud-go v0.36.0 github.com/ugorji/go => github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43 golang.org/x/text => github.com/golang/text v0.3.0 )
go.mod
中依賴庫的版本標籤都相似v.0.1.0
,其中打頭的v
是必須的,三個表示版本的數字也是被要求的。固然,並非嚴格要求。url
go mod
比較推崇這個給版本打release tag
的方式,好比咱們文件中的github.com/golang/text
,引用的版本被項目開發者明確的標記爲v0.3.0
。而它很是反對咱們經過具體的commit hash code
來引用一個具體的開發版本,因此,他有一套默認的版本機制,格式就是:v0.0.0-yyyymmddhhmmss-commit
,從咱們的go.mod
文件中也能夠看出來。3d
Modules and vendoring
當使用module
時,Go
命令會徹底忽略vendor
目錄。爲了跟以前Go
的依賴管理相兼容,咱們可使用go mod vendor
建立vendor
目錄來存儲編譯代碼的依賴包。若是在編譯的時候要使用vendor
中的依賴包,須要使用go build -mod=vendor
命令。code
go mod vendor go build -mod=vendor
Go Get
The -u flag instructs get to use the network to update the named packages and their dependencies. By default, get uses the network to check out missing packages but does not use it to look for updates to existing packages.
首先,go get
解析須要新增哪些依賴。能夠經過在包名後添加@version
或者@branch
等方式來取代命令的默認更新行爲。若是後綴指定爲@none
,則代表該依賴應該被移除。
其次,go get
會下載、編譯、安裝指定的包。包的安裝模式也是被容許的,好比使用go get golang.org/x/perf/cmd/..
來更新cmd
下的全部子包。
go get -u <repo url> go mod vendor
熟悉govendor
的肯能會有一種熟悉的感受,這不就是govendor add +e
嗎?