軟件名稱后面經(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)險(xiǎn)(必須對每一個相依套件改版才能完成某次升級)。而如果依賴關(guān)系過于松散蠢沿,又將無法避免版本的混亂(假設(shè)兼容于未來的多個版本已超出了合理數(shù)量)伸头。當(dāng)你專案的進(jìn)展因?yàn)榘姹鞠嘁辣绘i死或版本混亂變得不夠簡便和可靠,就意味著你正處于依賴地獄之中舷蟀。
這些規(guī)則是根據(jù)已經(jīng)被各種封閉恤磷、開放源碼軟件所廣泛使用的慣例所設(shè)計(jì)。為了讓這套理論運(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〔郑基于API才可以精確定義版本號的走向
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。因?yàn)榫然疖囀褂昧艘恍┌姹?3.1.0 所新增的功能酣倾, 你可以放心地指定相依于梯子的版本號大等于 3.1.0 但小于 4.0.0舵揭。這樣,當(dāng)梯子版本 3.1.1 和 3.2.0 發(fā)布時躁锡,你可以將直接它們納入你的套件管理系統(tǒng)午绳,因?yàn)樗鼈兡芘c原有相依的軟件兼容。
作為一位負(fù)責(zé)任的開發(fā)者映之,你理當(dāng)確保每次套件升級的運(yùn)作與版本號的表述一致±狗伲現(xiàn)實(shí)世界是復(fù)雜的蜡坊,我們除了提高警覺外能做的不多。你所能做的就是讓語義化的版本控制為你提供一個健全的方式來發(fā)行以及升級套件赎败,而無需推出新的相依套件秕衙,節(jié)省你的時間及煩惱。
本文章非原創(chuàng)僵刮,但是如果你對此認(rèn)同据忘,希望立即開始使用語義化版本控制,你只需聲明你的函式庫正在使用它并遵循這些規(guī)則就可以了. 更詳細(xì)的介紹可以參照http://semver.org/