序
本文主要研究一下golang的Pseudo-versions
Pseudo-versions
定义
Pseudo-versions,中文大概是伪版本的意思,就是没有打语义版本tag( semantic version tags )的会使用伪版本
格式
类似 v0.0.0-yyyymmddhhmmss-abcdefabcdef ,中间的时间为UTC时间( 东八区为utc+8 ),最后的12位为git commit的hash的前12位
forms
• vX.0.0-yyyymmddhhmmss-abcdefabcdef
• vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
在vX.Y.Z-pre( v3.9.0-pre )版本之后提交的commit,其Pseudo version第一部分为vX.Y.Z-pre.0( v3.9.0-pre.0 )
• vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef
在vX.Y.Z( v3.9.0 )版本之后提交的commit,其Pseudo version第一部分为vX.Y.(Z+1)-0( v3.9.1-0 )
+incompatible
对于有些依赖没有go.mod的,go.sum会出现 +incompatible ,比如
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
问题
•
基于分支commit的版本在改commit被删除之后会导致go mod invalid version
比如从特性分支合并到主干的时候采用 git merge –squash 且同时删除特性分支的方式会造成依赖之前依赖特性分支的commit丢失,最后导致依赖这个commit的工程无法build
•
基于tag的版本在tag被删除的时候,也会出现go mod invalid version
其他语言诸如java的maven,由仓库管理,除非特殊情况,一般不会去仓库删除版本,一般不会有误操作。go的这点也要特别注意,在删除tag的时候要小心。
小结
go的Pseudo-versions有点类似maven的snapshot的概念,都是基于时间戳的方式,不过go的仓库是基于git仓库的,所以带上了commit的hash信息。但是要特别注意go mod invalid version的问题。
doc
• Pseudo-versions[1]
• Where pseudo version with non-existent tag[2]
• Why go module pseudo version have a specific version?[3]
• Go Big With Pseudo-Versions and GoCenter[4]
外部链接
[1] Pseudo-versions #hdr-Pseudo_versions
[2] Where pseudo version with non-existent tag
[3] Why go module pseudo version have a specific version?
[4] Go Big With Pseudo-Versions and GoCenter