序
本文主要研究一下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
如果之前都没有major的语义版本tag则其Pseudo version第一部分为vX.0.0
- 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
)
对于有些依赖没有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的时候要小心。
doc
- Pseudo-versions
- Where pseudo version with non-existent tag
- Why go module pseudo version have a specific version?
- Go Big With Pseudo-Versions and GoCenter
推荐阅读
- 从golang-gin-realworld-example-app项目学写httpapi
- Go 语言基础--入门篇
- Go语言的设计哲学是怎么一回事()
- golang|golang中并发、gorutine
- golang|45天学会go --第五天 Go语言 函数
- golang|45天学会go --第2天go语言基本数据类型
- go-micro集成链路跟踪的方法和中间件原理
- GoLang底层|GoLang之堆内存系列一(堆内存管理)
- GoLang底层|GoLang之堆内存系列二(堆内存分配mallocgc)