序
本文次要钻研一下 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
)
+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
- Where pseudo version with non-existent tag
- Why go module pseudo version have a specific version?
- Go Big With Pseudo-Versions and GoCenter