vgo 简介:
vgo 是新一代的go项目包管理工具,在 go 1.11中已经支持,现在很多第三方库都使用vgo作为包管理工具,比如 echo框架
vgo官方介绍:wiki
使用环境:
- go 1.11及以上版本
- 在最新的go 版本中(1.12.4) 仍然需要配置环境变量 GO111MODULE=on 才能使用
- 下面所述的所有环境变量的设置都依赖于vgo未正式发布,仍然需要手动设置环境变量才能使用
使用vgo创建项目
本文以JetBrains公司的GoLand使用为例,版本为2019.1,2018.3的版本也有这个功能
项目目录中可以看到有个go.mod的文件 初始包含了module和go版本信息
当项目中需要获取第三方库时 仍然可以使用go get命令 ,比如 go get github.com/labstack/echo/v4 ,默认的将会拉取最新的包,如果需要指定版本则在后面加上@+版本号 比如,go get github.com/labstack/echo/[email protected] ,当你尝试用这条命令拉取时就会发现报错,应为echo的v4.15的包依赖 golang.org/x/ 下的包,由于某些原因拉取不到,这个时候就要介绍下go.mod下的三个关键字了
-
require
表示项目中需要的第三方依赖 ,比如
require (
github.com/jinzhu/gorm v1.9.8 // indirect
github.com/labstack/echo/v4 v4.1.5
)
修改了go.mod的require, 项目会更新 上面的//indirect 表示项目虽然导入了第三方库 但是在项目中并未使用 -
replace
替换依赖路径(也可以指向本地文件),比如上面的golang.org/x 下的sys 包获取失败,这可以使用这条命令,将golang.org/x/sys的地址指向github上的地址
replace (
golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190426145343-a29dc8fdc734
golang.org/x/sys => github.com/golang/sys v0.0.0-20190502175342-a43fa875dd82
)
注意:使用replace必须指定依赖版本,比如上面的 v0.0.0-20190502175342-a43fa875dd82 ,为什么这个版本那么奇怪呢? 那是因为有的第三方库并未发布过releases 比如sys,但是仍需要个版本号,这时候的版本号就是最新的commit,对于没有发布版本的第三方库,可以使用这种格式导包。 replace golang.org/x/sys => github.com/golang/sys latest 保存更新后就会自动变成这样 replace golang.org/x/sys => github.com/golang/sys v0.0.0-20190531175056-4c3a928424d2 -
exclude
用于排除指定版本的依赖包 ,暂未使用过
好了,介绍完上面的三个关键字,现在就能编辑我们的go.mod文件了,内容如下: 后面的v0.0.0-20190531175056-4c3a928424d2 其实是 latest
编辑完go.mod文件,保存更新后 ,项目目录下回多一个go.sum的文件,该文件用于记录每个依赖库的版本和哈希值。
第三方依赖包会保存到gopath->pkg->mod 目录下
项目发布
项目完成以后需要发布到服务器,有几点要注意,把项目上传到服务器以后直接go build 会报错,找不到依赖包,这是因为服务器上没有设置环境变量 export GO111MODULE=on 即可,和dep的包管理类似,第三方依赖包需要使用dep save命令将项目依赖保存到vender目录下,而vgo会在go build时,如果本地没有依赖库会自动拉取需要的依赖库。
注意:如果使用的是docker,需要在Dockerfile中设置环境变量 ENV GO111MODULE=on 否则项目报错