这世上太多的人,宁愿吃生活苦,也不肯吃自律的苦。大概是由于生活的苦,躺着就来了,而自律的苦,得本身去找。但只有吃得下自律的苦,才有成功的自由,没有一种成功是走得了捷径的,通向真正成功的惟一道路只有自律。越成功,越自律。越自律,越成功。
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
吗?