最近正在研究如何命名軟體的版本編號,比較符合現在常用的命名方式。當然版本號可以隨意訂,但是使用了一個大家通用的規則的話,其他人也比較容易從版本號上看出了不同版本之間的變化有多大。以下分享我所瞭解到的命名規則。

命名規則

首先,在開始分享之前,先提供一份參考文件。基本上我就是遵照這份文件的所定義的規則。

Semantic Versioning: http://semver.org/

這份文件有提供多種不同的語言供大家閱讀,我看了一下中文的翻譯也沒什麼問題,應該可以安心食用XD

那麼接下來就大致介紹一下主要的規則。

版本編號格式

版本編號必須要依照以下格式命名:

1
[主版本號].[次版本號].[修訂版本號]

以上每個編號都是 >= 0 的數字,下面就是一個符合規則的版本編號:

1
1.0.3

每次一發佈新版本的時候就遞增其中一個編號。

每個編號遞增的時機

  • 主版本號:軟體有重大更新的時候遞增,重大更新通常是指功能與介面都有大幅度變動的時候。
  • 次版本號:軟體發佈新功能,但是並不會大幅影響到整個軟體的時候遞增。
  • 修訂版本號:通常是在軟體有 bug,發布 bug 的修正版時遞增。

有些版本編號除了上述三者之外,還會有「建置版本號」。也就是只要每次建置一次軟體就會遞增一次,有時候甚至會使用建置的日期或時間來代表。不過已經很少人在用了。

版本號的比較

比較的規則很簡單,就是從最左邊的數字開始比。比較大的就是比較新的版本。

如果數字一樣的話,就比下一個數字。

以下是一個比較的例子:

1
1.0.0 < 1.0.1 < 1.1.0 < 1.2.0 < 1.4.5 < 2.0.0 < 2.1.12 < 2.3.2 < 3.0.0 ...

正式版之前的測試版本編號

有些軟體在發布正式版本之前,會先發布測試版本給大眾使用。測試版本不保證沒有任何 bug 或者功能完善。

通常測試版的 主版本號 會是 0,例如 0.3.1 就是一個測試版本。

而一般會使用 0.1.0 當作測試版的初始版本號。

提醒

除了以上規則之外,還有些規則的細節沒有提及。如果有興趣的話可以直接看看最上面提供的文件。

命名範例

以下分別以「線上遊戲」與「函式庫」兩者為例。

線上遊戲

假設現在有款 RPG 線上遊戲叫做 小山貓 online,一開始正式發佈的版本號是:

1
1.0.0

接著推出一段時間之後,為了增加遊戲的豐富性,新增了一些新的關卡與任務,此時 次版本號 有可能就會遞增:

1
1.1.0

新增了新功能不久,有玩家回報在解任務時會卡住,沒辦法繼續。工程師檢查之下發現是 bug,立即修正。因此發佈了 bug 修正版,修正版本號 遞增:

1
1.1.1

過了一段時間,又發布了新的關卡與任務,因此 次版本號 再度遞增,而 修正版本號 歸零:

1
1.2.0

就這樣持續了一段時間。隨著時間的推進,現有的地圖與故事似乎無法滿足玩家的需求,因此遊戲公司撰寫了新故事與製作了新地圖,推出了 小山貓的遠征之旅 大改版!

這個時候,遊戲出現了重大更新,所以 主版本號 很有可能就會遞增,後面的版本號則歸零:

1
2.0.0

這是一個線上遊戲可能的版本編號命名時機與流程。

函式庫

函式庫的狀況與遊戲不同,因為使用函式庫的人通常是開發其他程式的工程師,所以版本號遞增的時機也會不太一樣。

假設我寫了一個 小山貓函式庫,只要呼叫一個 catMeow() 這個函式,電腦喇叭就會發出貓咪的叫聲。

而版本編號一開始可能訂為:

1
1.0.0

此時我心血來潮,突然想要新增一個新的函式(新功能),catAnimate() 函式,呼叫之後程式畫面中就會出現貓咪動畫。

次版本號 可能就會遞增:

1
1.1.0

我突然接到其他開發者來信,他說他們呼叫了新的 catAnimate() 之後,沒有出現貓,而是出現狗!

這真是太嚴重了!必須要馬上修正這個 bug!因此我發布了一個修訂版本,且遞增了 修訂版本號

1
1.1.1

過了一段時間之後,我覺得現在這個 API 設計不好,我想用物件導向的方式重寫。

在重寫之後,任何人使用舊的功能之前,必須要先使用 new Cat() 建立一個貓咪物件,然後分別呼叫 cat.meow()cat.animate() 才能使用之前的功能。

這個改變影響到了許多已經寫好程式的開發者,因為他們必須要把所有使用到 小山貓函式庫 的地方全部改成新的寫法。

為了因應這種重大更新,此時必須要遞增 主版本號

1
2.0.0

小結

大家應該可以注意到一件事情,通常遊戲的重大更新對玩家來說都是一個令人開心的事件,但是函式庫的重大更新(主版本號遞增)通常對開發者來說就代表著:「Fxxk!程式又要大修了!」

開發者會視情況來決定是否要使用大更新後的函式庫。有很多情況是,開發者仍使用舊的版本(像是 小山貓函式庫1.1.1 版),而只有開發新程式的時候才會使用最新的版本。

例如 OpenGL 某次重大更新之後,大大地修改了繪圖的流程與方式,很多舊的函式都不能呼叫了,因此到現在還是很多人使用舊版。另外像是 Python 3 的更新也改掉了很多語法的使用方式。

總結

這邊提供的只是一種目前常看到的命名規則。當然要自己定義自己的規則也不是不行,像是直接用發布日期來當版本號,只是其他人就無法使用這種常用的邏輯來判斷版本號的意義。此時最好提供一份文件說明這些版本號的意義。

另外,有些軟體在測試期間,可能會使用不同規則的命名方式。

例如從 這份下載清單 可以看到, Minecraft 在測試期間的版本編號,是在前面分別加上 a 代表 alpha 版,加上 b 代表 beta 版。正式版本再使用類似這裡分享的規則來命名。

我個人是建議就遵照最上方文件提供的規則就好,使用一個大多數人都使用的規則並沒有什麼壞處。