序
本文主要研究一下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的問題。