【Go mod 学习之伪版本篇】采用 commit id 进行 go get 会生成伪版本号

总览

go.mod中通常使用语义化版本来标记依赖,比如v1.2.3v0.1.5等。因为go.mod文件通常是go命令自动生成并修改的,所以实际上是go命令习惯使用语义化版本。

诸如v1.2.3v0.1.5这样的语义化版本,实际是某个commit ID的标记,真正的版本还是commit ID。比如github.com/renhongcai/gomodule项目的v1.5.0对应的真实版本为20e9757b072283e5f57be41405fe7aaf867db220

由于语义化版本比commit ID更直观(方便交流与比较版本大小),所以一般情况下使用语义化版本。

伪版本:

  • 诸如v1.2.3v0.1.5这样的语义化版本,实际是某个commit ID的标记,真正的版本还是commit ID。比如github.com/renhongcai/gomodule项目的v1.5.0对应的真实版本为20e9757b072283e5f57be41405fe7aaf867db220
  • 在实际项目中,有时不得不直接使用一个commit ID,比如某项目发布了v1.5.0版本,但随即又修复了一个bug(引入一个新的commit ID),而且没有发布新的版本。此时,如果我们希望使用最新的版本,就需要直接引用最新的commit ID,而不是之前的语义化版本v1.5.0。 使用commit ID的版本在Go语言中称为pseudo-version,可译为"伪版本"
  • 伪版本的版本号通常会使用vx.y.z-yyyymmddhhmmss-abcdefabcdef格式,其中vx.y.z看上去像是一个真实的语义化版本,但通常并不存在该版本,所以称为伪版本。另外abcdefabcdef表示某个commit ID的前12位,而yyyymmddhhmmss则表示该commit的提交时间,方便做版本比较。

伪版本的拉取:

# 正常拉取,使用版本号 v1.5.0
[root@ecs-d8b6 ~]# go get github.com/renhongcai/gomodule@v1.5.0
go: finding github.com/renhongcai/gomodule v1.5.0
go: downloading github.com/renhongcai/gomodule v1.5.0
go: extracting github.com/renhongcai/gomodule v1.5.0
go: finding github.com/renhongcai/indirect v1.0.1

# commit 拉取,生成伪版本号,伪版本号不是我们指定的,是 go mod 自动生成的,具体的风格见下方介绍
# 可以看出伪版本号为  v1.5.1-0.20200203082525-6eb27062747a
[root@ecs-d8b6 ~]# go get github.com/renhongcai/gomodule@6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com 6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com/renhongcai/gomodule 6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com/renhongcai 6eb27062747a458a27fb05fceff6e3175e5eca95
go: downloading github.com/renhongcai/gomodule v1.5.1-0.20200203082525-6eb27062747a
go: extracting github.com/renhongcai/gomodule v1.5.1-0.20200203082525-6eb27062747a
go: finding github.com/renhongcai/indirect v1.0.2

伪版本风格:

  • 伪版本格式都为vx.y.z-yyyymmddhhmmss-abcdefabcdef,但vx.y.z部分在不同情况下略有区别,有时可能是vx.y.z-pre.0或者vx.y.z-0,甚至vx.y.z-dev.2.0等。

  • vx.y.z的具体格式取决于所引用commit ID之前的版本号,如果所引用commit ID之前的最新的tag版本为v1.5.0,那么伪版本号则在其基础上增加一个标记,即v1.5.1-0,看上去像是下一个版本一样。

  • 实际使用中go命令会帮我们自动生成伪版本,不需要手动计算,所以此处我们仅做基本说明。

1. 什么是伪版本

在实际项目中,有时不得不直接使用一个commit ID,比如某项目发布了v1.5.0版本,但随即又修复了一个bug(引入一个新的commit ID),而且没有发布新的版本。此时,如果我们希望使用最新的版本,就需要直接引用最新的commit ID,而不是之前的语义化版本v1.5.0。 使用commit ID的版本在Go语言中称为pseudo-version,可译为"伪版本"。

伪版本的版本号通常会使用vx.y.z-yyyymmddhhmmss-abcdefabcdef格式,其中vx.y.z看上去像是一个真实的语义化版本,但通常并不存在该版本,所以称为伪版本。另外abcdefabcdef表示某个commit ID的前12位,而yyyymmddhhmmss则表示该commit的提交时间,方便做版本比较。

使用伪版本的go.mod举例如下:

...
require (
    go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738
)
...

2. 伪版本风格

伪版本格式都为vx.y.z-yyyymmddhhmmss-abcdefabcdef,但vx.y.z部分在不同情况下略有区别,有时可能是vx.y.z-pre.0或者vx.y.z-0,甚至vx.y.z-dev.2.0等。

vx.y.z的具体格式取决于所引用commit ID之前的版本号,如果所引用commit ID之前的最新的tag版本为v1.5.0,那么伪版本号则在其基础上增加一个标记,即v1.5.1-0,看上去像是下一个版本一样。

实际使用中go命令会帮我们自动生成伪版本,不需要手动计算,所以此处我们仅做基本说明。

3. 如何获取伪版本

我们使用具体的例子还演示如何使用伪版本。在仓库github.com/renhongcai/gomodule中存在v1.5.0 tag 版本,在v1.5.0之后又提交了一个commit,并没有发布新的版本。其版本示意图如下:

img

为了方便描述,我们把v1.5.0对应的commit 称为commit-A,而其随后的commit称为commit-B

如果我们要使用commit-A,即v1.5.0,可使用go get github.com/renhongcai/gomodule@v1.5.0命令:

[root@ecs-d8b6 ~]# go get github.com/renhongcai/gomodule@v1.5.0
go: finding github.com/renhongcai/gomodule v1.5.0
go: downloading github.com/renhongcai/gomodule v1.5.0
go: extracting github.com/renhongcai/gomodule v1.5.0
go: finding github.com/renhongcai/indirect v1.0.1

此时,如果存在go.mod文件,github.com/renhongcai/gomodule体现在go.mod文件的版本为v1.5.0

如果我们要使用commit-B,可使用go get github.com/renhongcai/gomodule@6eb27062747a458a27fb05fceff6e3175e5eca95命令(可以使用完整的commit id,也可以只使用前12位):

[root@ecs-d8b6 ~]# go get github.com/renhongcai/gomodule@6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com 6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com/renhongcai/gomodule 6eb27062747a458a27fb05fceff6e3175e5eca95
go: finding github.com/renhongcai 6eb27062747a458a27fb05fceff6e3175e5eca95
go: downloading github.com/renhongcai/gomodule v1.5.1-0.20200203082525-6eb27062747a
go: extracting github.com/renhongcai/gomodule v1.5.1-0.20200203082525-6eb27062747a
go: finding github.com/renhongcai/indirect v1.0.2

此时,可以看到生成的伪版本号为v1.5.1-0.20200203082525-6eb27062747a,当前最新版本为v1.5.0go命令生成伪版本号时自动增加了版本。此时,如果存在go.mod文件的话,github.com/renhongcai/gomodule体现在go.mod文件中的版本则为该伪版本号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值