軟件名稱后面經(jīng)常有一些英文和數(shù)字,如Windows 7,Android 6.0.0,這些都是軟件的版本標(biāo)志,通過它,我們可以對軟件的類型有所了解。版本控制比較普遍的 3 種命名格式 :GNU 風(fēng)格的版本號命名格式、Windows 風(fēng)格的版本號命名格式、.Net Framework 風(fēng)格的版本號命名格式,其實(shí)都可以歸類為語義化版本.
簡介
在軟件管理的領(lǐng)域里存在著被稱作“依賴地獄”的死亡之谷,系統(tǒng)規(guī)模越大,加入的套件越多,你就越有可能在未來的某一天發(fā)現(xiàn)自己已深陷絕望之中。
在依賴高的系統(tǒng)中發(fā)布新版本套件可能很快會成為惡夢。如果依賴關(guān)系過高,可能面臨版本控制被鎖死的風(fēng)險(必須對每一個相依套件改版才能完成某次升級)。而如果依賴關(guān)系過于松散,又將無法避免版本的混亂(假設(shè)兼容于未來的多個版本已超出了合理數(shù)量)。當(dāng)你專案的進(jìn)展因為版本相依被鎖死或版本混亂變得不夠簡便和可靠,就意味著你正處于依賴地獄之中。
這些規(guī)則是根據(jù)已經(jīng)被各種封閉、開放源碼軟件所廣泛使用的慣例所設(shè)計。為了讓這套理論運(yùn)作,必須先有定義好的公共 API 。這可以透過文件定義或代碼強(qiáng)制要求來實(shí)現(xiàn)。無論如何,這套 API 的清楚明了是十分重要的。一旦你定義了公共 API,你就可以透過修改相應(yīng)的版本號來向大家說明你的修改??紤]使用這樣的版本號格式:X.Y.Z (主版本號.次版本號.修訂號)修復(fù)問題但不影響API 時,遞增修訂號;API 保持向下兼容的新增及修改時,遞增次版本號;進(jìn)行不向下兼容的修改時,遞增主版本號。
這套系統(tǒng)被定義為“語義化的版本控制”,在這套約定下,版本號及其更新方式包含了相鄰版本間的底層代碼和修改內(nèi)容的信息。
規(guī)范
1. 語義化版本控制的軟件必須定義公共 API?;贏PI才可以精確定義版本號的走向
2. 版本號必須采用 X.Y.Z 的格式,?? 其中 X、Y 和 Z 為非負(fù)的整數(shù),且禁止在數(shù)字前方補(bǔ)零。X 是主版本號、Y 是次版本號、而 Z 為修訂號。每個元素必須以數(shù)值來遞增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
3. 標(biāo)記版本號的軟件發(fā)行后,禁止改變該版本軟件的內(nèi)容。任何修改都必須以新版本發(fā)行。
4. 主版本號為零(0.y.z)的軟件處于開發(fā)初始階段,一切都可能隨時被改變。這樣的公共 API 不應(yīng)該被視為穩(wěn)定版。
5. 1.0.0 的版本號用于界定公共 API 的形成。這一版本之后所有的版本號更新都基于公共 API 及其修改內(nèi)容。
6. 修訂號 Z(x.y.Z > 0)必須在只做了向下兼容的修正時才遞增。這里的修正指的是針對不正確結(jié)果而進(jìn)行的內(nèi)部bug fix。
7. 次版本號 Y(x.Y.z > 0)必須在有向下兼容的新功能出現(xiàn)時遞增。在任何公共 API 的功能被標(biāo)記為棄用時也必須遞增。也可以在內(nèi)部程序有大量新功能或改進(jìn)被加入時遞增。而每當(dāng)次版本號遞增時,修訂號必須歸零。
8. 主版本號 X(X.y.z > 0)必須在有任何不兼容的修改被加入公共 API 時遞增。其中可以包括次版本號及修訂級別的改變。每當(dāng)主版本號遞增時,次版本號和修訂號必須歸零。
為什么要使用語義化的版本控制?
這并不是一個新的或者革命性的想法。實(shí)際上,你可能已經(jīng)在做一些近似的事情了。問題在于只是“近似”還不夠。如果沒有某個正式的規(guī)范可循,版本號對于依賴的管理并無實(shí)質(zhì)意義。將上述的想法命名并給予清楚的定義,讓你對軟件使用者傳達(dá)意向變得容易。一旦這些意向變得清楚,彈性(但又不會太彈性)的依賴規(guī)范就能達(dá)成。
舉個簡單的例子就可以展示語義化的版本控制如何讓依賴地獄成為過去。假設(shè)有個名為“救火車”的函式庫,它需要另一個名為“梯子”并已經(jīng)有使用語義化版本控制的套件。當(dāng)救火車創(chuàng)建時,梯子的版本號為 3.1.0。因為救火車使用了一些版本 3.1.0 所新增的功能, 你可以放心地指定相依于梯子的版本號大等于 3.1.0 但小于 4.0.0。這樣,當(dāng)梯子版本 3.1.1 和 3.2.0 發(fā)布時,你可以將直接它們納入你的套件管理系統(tǒng),因為它們能與原有相依的軟件兼容。
作為一位負(fù)責(zé)任的開發(fā)者,你理當(dāng)確保每次套件升級的運(yùn)作與版本號的表述一致?,F(xiàn)實(shí)世界是復(fù)雜的,我們除了提高警覺外能做的不多。你所能做的就是讓語義化的版本控制為你提供一個健全的方式來發(fā)行以及升級套件,而無需推出新的相依套件,節(jié)省你的時間及煩惱。
本文章非原創(chuàng),但是如果你對此認(rèn)同,希望立即開始使用語義化版本控制,你只需聲明你的函式庫正在使用它并遵循這些規(guī)則就可以了. 更詳細(xì)的介紹可以參照http://semver.org/