Go Modules( vgo ) 的介绍与使用以及Go Module Proxy

vgo 简介:

vgo 是新一代的go项目包管理工具,在 go 1.11中已经支持,现在很多第三方库都使用vgo作为包管理工具,比如 echo框架
vgo官方介绍:wiki

使用环境:

  1. go 1.11及以上版本
  2. 在最新的go 版本中(1.12.4) 仍然需要配置环境变量 GO111MODULE=on 才能使用
  3. 下面所述的所有环境变量的设置都依赖于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/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 用于清理本地缓存

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值