专栏首页大卫李的技术分享让Go Module重新Respect Go Vendor (一)

让Go Module重新Respect Go Vendor (一)

升级Go  1.11后遇到的问题

  • Go module怎么使用
  • 开始不respect vendor目录,导致go build失败,第三方依赖找不到了
  • 是抛弃Vendor,从此投入Module怀抱?

Go module快速入门

引入Go module后,新增了一组go mod命令,可以通过go help mod查看使用帮助,如下图所示,目前一共有8个子命令,每个子命令都有多种使用参数,感觉学习成本抖增。

想要知道到底怎么用,当然是亲自动手demo一把。推荐入门文章:https://roberto.selbach.ca/intro-to-go-modules/

  1. 首先创建一个testmod包,作为工具类,并使用go mod init github.com/nevermosby/testmod命令,把这个包初始化成一个module,本质上就是生成一个go.mod文件,内容如下:
$ cat go.mod
module github.com/nevermosby/testmod
  1. 然后为testmod在github上作tag,通过git push命令release这个tag版本。这样,对于testmod来说,它就有了第一个版本v1.0.0
  2. 接着在创建一个usemod包,作为主程序类,这个主程序里会引用testmod这个工具类作为依赖:
import github.com/nevermosby/testmod

并使用go mod init moduleName命令生成go.mod文件,相当于创建了一个module模块,内容为:

$ cat go.mod
module moduleName

执行go build会把import依赖包生成为require语句块,如下所示:

module moduleName
require github.com/nevermosby/testmod v1.0.0

这样,usemod包就能通过go module机制管理依赖了。

  1. 此时,我们有想法升级testmod工具类提供的接口,比如为接口添加新的参数,完成代码修改后,再打个tag并release,第二个版本v2.0.0就诞生了。
  2. 彼时,usemod作为testmod使用方,也需要更新相关代码,并且在调用新接口的同时,保留老的接口使用方式,因此需要同时import两个版本的testmod,更新usermod的import部分:
import (
    "github.com/nevermosby/testmod"
    testmodv2 "github.com/nevermosby/testmod/v2"
)

随后重新执行go build命令,会更新go.mod文件为:

module moduleName
require (
    github.com/nevermosby/testmod v1.0.0
    github.com/nevermosby/testmod/v2 v2.0.0
)

en, 现在就可以同时引入两个版本的testmod了,是不是很有趣!

下一篇,我们一起来show some respect to Vendor。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 让Go Module重新Respect Go Vendor(二)

    Vendor目录是Golang从1.5版本开始引入的,为项目开发提供了一种离线保存第三方依赖包的方法。但是到了Golang 1.11之后,由于引入了Module...

    nevermosby
  • Openshift V4 is coming

    官方宣称从openshift v4开始,由CRC这个工具提供provision服务。

    nevermosby
  • 调试你的BPF程序

    文章涉及的实验环境和代码可以到这个git repo获取: https://github.com/nevermosby/linux-bpf-learning

    nevermosby
  • java常用正则表达式

    只能输入数字:"^[0-9]*$"。 只能输入n位的数字:"^\d{n}$"。 只能输入至少n位的数字:"^\d{n,}$"。 只能输入m~n位的数...

    哲洛不闹
  • Golang中的包管理工具 - Go Modules

    在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下...

    猿哥
  • 一起来学Go --- (go的简介以及环境的安装)

    相信大家,看到这篇文章的时候,已经自己在百度百科了解了go的发展史已经特性,再次我依然。。。。得哔哔叨一会。   ^.^

    Wyc
  • 阿诺德灯光雾效果如何创建?

    3,在render seting中,在Environment下单击Atmosphere右侧的菜单。选择 cteate aiAtmosphereVolume.

    Renderbus云渲染农场
  • mxnet:结合R与GPU加速深度学习

    近年来,深度学习可谓是机器学习方向的明星概念,不同的模型分别在图像处理与自然语言处理等任务中取得了前所未有的好成绩。在实际的应用中,大家除了关心模型的准确度,还...

    素质
  • golang 几种字符串的连接方式

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现。 实现方法 直接使用运算...

    李海彬
  • kubernetes 基础集群排障

    在排错过程中,kubectl 是最重要的工具,通常也是定位错误的起点。这里也列出一些常用的命令,在后续的各种排错过程中都会经常用到。

    马凌鑫

扫码关注云+社区

领取腾讯云代金券