本文次要钻研一下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