Go版本依赖--伪版本
1.简介
在go.mod中通常使用语义化版本来标记依赖,比如v1.2.3、v0.1.5等。因为go.mod文件通常是go命令自动生成并修改的,所以实际上是go命令习惯使用语义化版本。
诸如v1.2.3和v0.1.5这样的语义化版本,实际是某个commit ID的标记,真正的版本还是commit ID。
比如github.com/renhongcai/gomodule项目的v1.5.0对应的真实版本为20e9757b072283e5f57be41405fe7aaf867db220。
由于语义化版本比commit ID更直观(方便交流与比较版本大小),所以一般情况下使用语义化版本。
2. 什么是伪版本
在实际项目中,有时不得不直接使用一个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
)
...
3. 伪版本风格
伪版本格式都为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命令会帮我们自动生成伪版本,不需要手动计算,所以此处仅做基本说明。
4. 如何获取伪版本
使用具体的例子还演示如何使用伪版本。在仓库github.com/renhongcai/gomodule中存在v1.5.0 tag 版本,在v1.5.0之后又提交了一个commit,并没有发布新的版本。其版本示意图如下:

为了方便描述,我们把1.5.0对应的commit 称为commit-A,而其随后的commit称为commit-B。
如果我们要使用commit-A,即v1.5.0,可使用go get github.com/renhongcai/gomodule@v1.5.0命令:
[root@wsl-maoyifei ~]# 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@wsl-maoyifei ~]# 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.0,go命令生成伪版本号时自动增加了版本。此时,如果存在go.mod文件的话,github.com/renhongcai/gomodule体现在go.mod文件中的版本则为该伪版本号。
Go版本依赖--伪版本的更多相关文章
- Spring IO Platform 解决Spring项目组合中版本依赖
简介: Spring IO Platform是Spring官网中排第一位的项目.它将Spring的核心API集成到一个适用于现代应用程序的平台中.提供了Spring项目组合中的版本依赖.这些依赖关系是 ...
- Spring Boot 指定某个依赖的版本
Spring Boot 是个很好的框架,他为了他的一些功能生效,定义了一些依赖的版本. 比如说:Spring Boot 1.5.x 中elasticSearch是2.4.x的,这个是他本身就定义好的. ...
- CentOS 7安装新版RabbitMQ解决Erlang 19.3版本依赖
通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...
- .Net版本依赖之坑引发的搜查
前言 今天上午,一个客户反馈XX消息没有推送到第三方链接.于是我查看了推送日志列表,并没有今天的.接着登录服务器查询文件日志,看到了记录.我们的代码步骤是消息先推送到消息队列,消费消息队列时,记录文件 ...
- 【Linux】安装openssh-server依赖openssh-client版本错误的解决办法
这是因为,openssh-server是依赖于openssh-clien的,ubuntu自带了openssh-client,自带的openssh-clien与所要安装的openssh-server所依 ...
- java.util.zip.ZipException: duplicate entry(重复依赖多版本的类库)
同步SVN仓库中的代码,更新后,运行项目,出现如下错误: com.android.build.api.transform.TransformException: java.util.zip.ZipEx ...
- Springcloud的版本依赖问题(最全,包含springCloud所有的版本)
版权声明:本文为博主原创文章,遵循CC 4.0 BY版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_42105629/article/detai ...
- Maven中使用<version>LATEST</version>自动依赖最新版本引发的问题
今天在打包项目的过程中出现了编译问题,奇怪的是这个项目已经好久没有修改过了,报错如下. 找不到符号 [ERROR] 符号: 方法 intent(java.lang.String) [ERROR] 位置 ...
- yarn 强制孙依赖的版本
今天博主遇到一个棘手的问题,@vue/cli-service 依赖了一个包 portfiner@^1.0.20,但是 2 天前,这个包更新到了1.0.22,带来了一些问题. 博主第一反应就是想 yar ...
随机推荐
- Guass消元总结
Guass消元 约旦·高斯消元法 求线性方程组 我们用一个\(n*(n+1)\)的矩阵存储线性方程组各项系数和零次项系数. 每一次找到一个未知数系数最大的方程,交换当前行方程和该方程,并将其他行该未知 ...
- idea创建web工程、配置tomcat及基本配置
背景 现在许多人从eclipse转到idea了,小编也不例外.但是刚转初期还是有挺多不适应的,特总结了创建maven的web工程.配置tomcat服务器及基本配置.有了这些配置,上手idea也就跟ec ...
- HCNA Routing&Switching之GVRP
前文我们了解了不同vlan间路由相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15110336.html,今天我们来聊一聊vlan动态注册相关话题: ...
- 为什么crictl和ctr的输出有时不一样
containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间 cr ...
- 「必知必会」最细致的 LinkedList 原理分析
1.结构 1. 继承 该类继承自 AbstractSequentialList 这个是由于他是一个顺序的列表,所以说继承的是一个顺序的 List 2. 实现 这个类实现的接口比较多,具体如下: 首 ...
- Java基础——逻辑运算符、位运算符
逻辑运算符.位运算符.三元运算符 逻辑运算符 public class Demon05 { public static void main(String[] args) { ...
- Mysql数据库基础知识(全)
前言:本博文为个人笔记,记录了Mysql的一些基本操作,一般掌握本博文就可以了解数据库.表.数据项的增删改查,希望对大家的学习有所帮助. 首先下载PHPSTUDY,将Mysql配置为系统变量. 具体操 ...
- RHCSA_DAY05
计算机硬件组成部分 输入设备:键盘.鼠标.触控屏等 主机设备:主板.中央处理器(CPU).主存储器(内存).网卡.声卡.显示卡等 输出设备:屏幕.耳机.打印机.投影仪等 外部存储设备:硬盘.软盘.光盘 ...
- 阿里饿死了么Android面试凉经,两轮面完被虐哭了,怒清购物车。。。卸载饿死了么
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了 ...
- shell——sed编辑器
目录 一.sed编辑器 1.1.sed编辑器工作流程 读取: 执行: 显示: 1.2.格式 1.3.常用选项 1.4.常用操作 1.5.替换 一.sed编辑器 sed是一种流编辑器,流编辑器会在编辑器 ...