語義化版本管理

說明

  1. 此處是原文網(wǎng)址鏈接
  2. 本文沒有任何商業(yè)目的砸抛,也禁止任何商業(yè)目的的使用,轉(zhuǎn)載,引用等
  3. 如有侵權(quán)骏庸,請(qǐng)聯(lián)系刪除

概要

給出一個(gè)的版本號(hào) MAJOR.MINOR.PATCH,出現(xiàn)下面的情況增加與之對(duì)應(yīng)的版本號(hào):

  1. 增加 MAJOR 版本年叮,當(dāng)做出一些非兼容性 API 修改具被,
  2. 增加 MINOR 版本,當(dāng)以向后兼容的方式添加一些功能性修改只损,
  3. 增加 PATCH 版本一姿,當(dāng)修復(fù)了一些向后兼容的問題。

用于預(yù)發(fā)布和構(gòu)建的元數(shù)據(jù)的附加標(biāo)簽可以作為 MAJOR.MINOR.PATCH 格式的擴(kuò)展跃惫。

介紹

在軟件管理的世界里叮叹,有一個(gè)可怕的地方叫做“依賴地獄”。系統(tǒng)越大爆存,集成到軟件中的軟件包越多蛉顽,您就越有可能在某一天發(fā)現(xiàn)自己陷入絕望的深淵。

在具有許多依賴項(xiàng)的系統(tǒng)中先较,發(fā)布新的包版本會(huì)很快成為一場(chǎng)噩夢(mèng)携冤。如果依賴規(guī)范太緊,你就會(huì)面臨版本鎖定的危險(xiǎn)(無法升級(jí)軟件包如果不發(fā)布每個(gè)依賴包的新版本)闲勺。如果依賴關(guān)系的指定過于松散曾棕,你將不可避免地受到版本混亂的影響(假設(shè)與未來版本的兼容性超過了合理水平)。依賴地獄就是當(dāng)出現(xiàn)版本鎖定和/或版本混亂阻止你輕松安全地將項(xiàng)目向前推進(jìn)時(shí)的情況菜循。

作為這個(gè)問題的解決方案翘地,我提出了一組簡(jiǎn)單的規(guī)則和需求,它們規(guī)定了版本號(hào)是如何分配和增加的债朵。這些規(guī)則是建立在封閉軟件和開放源代碼軟件中普遍使用的實(shí)踐基礎(chǔ)上的子眶,但并不一定僅限于此。要使這個(gè)規(guī)則系統(tǒng)工作序芦,首先需要聲明一個(gè)公共API臭杰。這可以由文檔組成,也可以由代碼本身強(qiáng)制執(zhí)行谚中。不管怎樣渴杆,這個(gè)API必須清晰和精確寥枝。一旦你確定了你的公共API,你就可以通過特定的版本號(hào)增量來表示對(duì)其所做的修改磁奖。采用 X.Y.Z(Major.Minor.Patch) 的版本格式 囊拜。不影響API的Bug修復(fù)增加 Patch 版本,向后兼容的 API 添加/更改增加 Minor 版本比搭,向后不兼容的 API 更改增加 Major 版本冠跷。

我稱這個(gè)版本系統(tǒng)為“語義化版本管理”。在這個(gè)方案下身诺,版本號(hào)及版本變化方式傳達(dá)了底層代碼的含義蜜托,以及從一個(gè)版本到下一個(gè)版本的修改內(nèi)容。

語義化版本管理規(guī)范(SemVer)

本文件中的關(guān)鍵詞 “MUST”霉赡,“MUST NOT”橄务,“REQUIRED”,“SHALL”穴亏,“SHALL NOT”蜂挪,“SHOULD”,“SHOULD NOT”嗓化,“RECOMMENDED”棠涮,“MAY”和”O(jiān)PTIONAL“按RFC 2119中的描述理解。

  1. MUST:本詞或術(shù)語“REQUIRED”或“SHALL”指的是定義是規(guī)范的絕對(duì)要求蟆湖。
  2. MUST NOT:本短語或“SHALL NOT”短語的意思是定義是絕對(duì)禁止的規(guī)范故爵。
  3. SHOULD:本詞或者形容詞“RECOMMENDED”表示在特殊情況下可能存在合理有效的理由去忽略特定的項(xiàng)目,但在選擇不同的方向前必須理解其全部含義隅津,并仔細(xì)權(quán)衡诬垂。
  4. SHOULD NOT:本短語,或者這個(gè)短語”NOT RECOMMENDED“ 表示在特殊情況下存在合理有效的理由伦仍,表明特定的行為是可接收的或甚至是更有用的结窘,但是在實(shí)現(xiàn)這個(gè)標(biāo)簽描述的任何行為之前,應(yīng)該理解其完整的含義并仔細(xì)的權(quán)衡充蓝。
  5. MAY:本詞隧枫,或形容詞“OPTIONAL”,表示一個(gè)項(xiàng)目是 真正地可選谓苟。一個(gè)供應(yīng)商可能會(huì)選擇包括該項(xiàng)目官脓,因?yàn)橐粋€(gè)特定的市場(chǎng)需要它,或者因?yàn)楣?yīng)商感覺它增強(qiáng)了產(chǎn)品而另一個(gè)供應(yīng)商可能會(huì)忽略相同的項(xiàng)目涝焙。不包含某個(gè)特定選項(xiàng)的實(shí)現(xiàn)必須考慮與另一個(gè)包括這個(gè)特定選項(xiàng)的實(shí)現(xiàn)進(jìn)行交互操作 卑笨,盡管這可能會(huì)減少功能。在同樣的脈絡(luò)里一個(gè)包含某個(gè)特定選項(xiàng)的實(shí)現(xiàn)必須考慮與另一個(gè)沒有包含某個(gè)特定選項(xiàng)的實(shí)現(xiàn)進(jìn)行相互交互(當(dāng)然仑撞,除了特定選項(xiàng)提供的功能)赤兴。
  1. 使用語義化版本管理的軟件必須聲明一個(gè)公開API妖滔。這個(gè)API可以在代碼中聲明,也可以嚴(yán)格存在于文檔中桶良。一旦這個(gè)API定義完成座舍,它應(yīng)該是精確和全面的。

  2. 正常版本號(hào)必須采用X.Y.Z的形式陨帆,其中X曲秉、Y和Z是非負(fù)整數(shù),且不能包含前置零(01/02的0)疲牵。X是主版本(Major)岸浑,Y是次版本(Minor),Z是補(bǔ)丁版本(Patch)瑰步。每個(gè)元素都必須按數(shù)字遞增。例如:1.9.0 -> 1.10.0 -> 1.11.0璧眠。

  3. 一旦發(fā)布了版本化的包缩焦,就不能修在改該版本的內(nèi)容。任何修改都必須作為新版本發(fā)布责静。

  4. 主(Major)版本0(0.y.z)用于初始開發(fā)袁滥。任何事情都可能在任何時(shí)候發(fā)生變化。這個(gè)版本的公開API不應(yīng)該被認(rèn)為是穩(wěn)定的灾螃。

  5. 版本1.0.0定義了公共API题翻。這個(gè)版本發(fā)布以后,版本號(hào)增加的方式取決于此公開API及此API變化的方式腰鬼。

  6. 補(bǔ)肚对(Patch)版本Z(x.y.Z | x > 0)必須增加,如果只引入向后兼容的錯(cuò)誤修復(fù)熄赡。錯(cuò)誤修復(fù)定義是修復(fù)不正確行為的內(nèi)部更改姜挺。

  7. 次(Minor)版本Y (x.Y.z | x > 0)必須增加,如果向公共API引入了向后兼容的新功能彼硫。

    • 如果任何公開API功能被標(biāo)記為deprecated炊豪,此版本必須增加。
    • 如果在私有代碼中引入了實(shí)質(zhì)性的新功能或改進(jìn)拧篮,此版本號(hào)可能會(huì)增加词渤。
    • 次版本增加時(shí)可能包括補(bǔ)丁級(jí)別的更改。當(dāng)次版本增加時(shí)串绩,補(bǔ)丁版本必須重置為0缺虐。
  8. 主(Major)版本X(X.y.z | X > 0)必須增加,如果向公開API引入任何向后不兼容的更改赏参。

    • 它也可能包括此版本和補(bǔ)丁版本級(jí)別的修改志笼。
    • 當(dāng)主版本增加時(shí)沿盅,補(bǔ)丁版本和次版本必須重置為0。
  9. 一個(gè)預(yù)發(fā)布版本可以通過在補(bǔ)丁版本后面附加一個(gè)連字符(-)和一系列以點(diǎn)(.)分隔的標(biāo)識(shí)符來表示纫溃。

    • 標(biāo)識(shí)符只能由ASCII字母數(shù)字和連字符組成 [0-9A-Za-z-]腰涧。
    • 標(biāo)識(shí)符不能為空。
    • 數(shù)字標(biāo)識(shí)符不能包含前置零紊浩。
    • 預(yù)發(fā)布版本的優(yōu)先級(jí)低于相關(guān)的正常版本窖铡。

    預(yù)發(fā)布版本表明該版本是不穩(wěn)定的,并且可能不能滿足與其相關(guān)的正常版本所表示的預(yù)期的兼容性需求坊谁。示例:1.0.0-alpha费彼,1.0.0-alpha.1,1.0.0-0.3.7口芍,1.0.0-x.7.z.92箍铲,1.0.0-x-y-z.–。

  10. 構(gòu)建的元數(shù)據(jù)可以通過在補(bǔ)丁或預(yù)發(fā)布版本之后立即附加一個(gè)加號(hào)和以一系列點(diǎn)分隔的標(biāo)識(shí)符來表示鬓椭。

    • 標(biāo)識(shí)符只能由ASCII字母數(shù)字和連字符組成 [0-9A-Za-z-]颠猴。
    • 標(biāo)識(shí)符不能為空。

    在確定版本優(yōu)先級(jí)時(shí)小染,構(gòu)建的元數(shù)據(jù)必須被忽略翘瓮。因此,僅在構(gòu)建的元數(shù)據(jù)方面不同的兩個(gè)版本具有相同的優(yōu)先級(jí)裤翩。例如:1.0.0-alpha+001资盅,1.0.0+20130313144700,1.0.0-beta+exp.sha.5114f85踊赠,1.0.0+21AF26D3—-117B344092BD呵扛。

  11. 優(yōu)先級(jí)指的是排序時(shí)版本之間的比較方式。

    1. 優(yōu)先級(jí)必須將版本劃分為主筐带、次择份、補(bǔ)丁和預(yù)發(fā)布標(biāo)識(shí)符,按照順序分別比較(構(gòu)建的元數(shù)據(jù)不能表明優(yōu)先級(jí))烫堤。

    2. 優(yōu)先級(jí)由下面所列的從左到右進(jìn)行比較每個(gè)標(biāo)識(shí)符時(shí)的第一個(gè)差異決定:主要荣赶、次要和補(bǔ)丁版本總是在數(shù)字上進(jìn)行比較。例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1鸽斟。

    3. 當(dāng)主版本拔创、次版本和補(bǔ)丁版本相同時(shí),預(yù)發(fā)布版本的優(yōu)先級(jí)低于正常版本富蓄,例如:1.0.0-alpha < 1.0.0剩燥。

    4. 具有相同主、次和補(bǔ)丁版本的兩個(gè)預(yù)發(fā)布版本的優(yōu)先級(jí)必須將每個(gè)以點(diǎn)分隔的標(biāo)識(shí)符從左到右進(jìn)行比較,直到發(fā)現(xiàn)差異時(shí)根據(jù)下面的規(guī)則決定:

      1. 僅由數(shù)字組成的標(biāo)識(shí)符按數(shù)字進(jìn)行比較。
      2. 帶有字母或連字符的標(biāo)識(shí)符按ASCII排序順序進(jìn)行詞法比較。
      3. 數(shù)字標(biāo)識(shí)符的優(yōu)先級(jí)總是低于非數(shù)字標(biāo)識(shí)符掺涛。
      4. 如果前面的標(biāo)識(shí)符都相等健芭,那么更大的預(yù)發(fā)布字段集的優(yōu)先級(jí)要高于更小的預(yù)發(fā)布字段集味榛。

    示例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子策添,更是在濱河造成了極大的恐慌,老刑警劉巖毫缆,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯竹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡苦丁,警方通過查閱死者的電腦和手機(jī)浸颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旺拉,“玉大人猾愿,你說我怎么就攤上這事≌俗瑁” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵泽本,是天一觀的道長(zhǎng)淘太。 經(jīng)常有香客問我,道長(zhǎng)规丽,這世上最難降的妖魔是什么蒲牧? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮赌莺,結(jié)果婚禮上冰抢,老公的妹妹穿的比我還像新娘。我一直安慰自己艘狭,他們只是感情好挎扰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巢音,像睡著了一般遵倦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上官撼,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天梧躺,我揣著相機(jī)與錄音,去河邊找鬼傲绣。 笑死掠哥,一個(gè)胖子當(dāng)著我的面吹牛巩踏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播续搀,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塞琼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了目代?” 一聲冷哼從身側(cè)響起屈梁,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榛了,沒想到半個(gè)月后在讶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霜大,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年构哺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片战坤。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曙强,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出途茫,到底是詐尸還是另有隱情碟嘴,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布囊卜,位于F島的核電站娜扇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏栅组。R本人自食惡果不足惜雀瓢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玉掸。 院中可真熱鬧刃麸,春花似錦、人聲如沸司浪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊易。三九已至脱吱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間认罩,已是汗流浹背箱蝠。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宦搬。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓牙瓢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親间校。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矾克,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354