赞
踩
vgo 是新一代的go项目包管理工具,在 go 1.11中已经支持,现在很多第三方库都使用vgo作为包管理工具,比如 echo框架
vgo官方介绍:wiki
本文以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/v4@v4.1.5 ,当你尝试用这条命令拉取时就会发现报错,应为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 否则项目报错
对于某些国内拉不到的仓库,除了使用vgo 中的 replace,也可以使用goproxy ,当用户请求一个依赖库时,如果它发现本地没有这份代码就会自动请求源,然后缓存到本地,用户就可以从 goproxy.io 请求到数据。当然,这些都是在一个请求中完成的。goproxy.io 只支持 go module 模式。
要添加环境变量 export GOPROXY=https://goproxy.io,同理如果使用镜像,在Dockerfile中添加
ENV GOPROXY=https://goproxy.io
go mod 还支持 将依赖库保存在vendor中,go mod vendor 会复制modules下载到vendor中, 貌似只会下载你代码中引用的库,而不是go.mod中定义全部的module。
在拉去第三方组件的时候如果不想拉去最新的已发布版本,而是想拉去master上最新提交的代码,这就需要在go get 时指定版本 比如 go get github.com/xxx/xxx@master
go clean -modcache 用于清理本地缓存
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。