Blog.5 Go Module

這世上太多的人,寧願吃生活苦,也不肯吃自律的苦。大概是由於生活的苦,躺着就來了,而自律的苦,得本身去找。但只有吃得下自律的苦,纔有成功的自由,沒有一種成功是走得了捷徑的,通向真正成功的惟一道路只有自律。越成功,越自律。越自律,越成功。

GO111MODULE

Go 1.1包含了對Go Modules預支持,包括調整後的go get命令。後續版本總GOPATH和老的go get可能會被官方移除。git

Go Modules中支持了一個臨時環境變量:GO111MODULE,能夠賦值爲offonautogithub

  1. 值爲off,表示不支持Go Modules模式,Go仍然在vendorGoPATH路徑下查找依賴;
  2. 值爲on,表示當前明確使用Go ModulesGo再也不去GOPATH下查找任何依賴;
  3. 值爲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文件的每一行都包還一個簡單的指令(modulerequireexcludereplace),而後緊跟參數部分。指令除了單行表示以外,還能夠是一個塊的形式。其中,文件也是以//做爲註釋符。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嗎?

相關文章
相關標籤/搜索