聊聊golang的Pseudo-versions

codecraft發表於2022-05-16

本文主要研究一下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

相關文章