說明
- 此處是原文網(wǎng)址鏈接
- 本文沒有任何商業(yè)目的砸抛,也禁止任何商業(yè)目的的使用,轉(zhuǎn)載,引用等
- 如有侵權(quán)骏庸,請(qǐng)聯(lián)系刪除
概要
給出一個(gè)的版本號(hào) MAJOR.MINOR.PATCH
,出現(xiàn)下面的情況增加與之對(duì)應(yīng)的版本號(hào):
- 增加 MAJOR 版本年叮,當(dāng)做出一些非兼容性 API 修改具被,
- 增加 MINOR 版本,當(dāng)以向后兼容的方式添加一些功能性修改只损,
- 增加 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中的描述理解。
- MUST:本詞或術(shù)語“REQUIRED”或“SHALL”指的是定義是規(guī)范的絕對(duì)要求蟆湖。
- MUST NOT:本短語或“SHALL NOT”短語的意思是定義是絕對(duì)禁止的規(guī)范故爵。
- SHOULD:本詞或者形容詞“RECOMMENDED”表示在特殊情況下可能存在合理有效的理由去忽略特定的項(xiàng)目,但在選擇不同的方向前必須理解其全部含義隅津,并仔細(xì)權(quán)衡诬垂。
- SHOULD NOT:本短語,或者這個(gè)短語”NOT RECOMMENDED“ 表示在特殊情況下存在合理有效的理由伦仍,表明特定的行為是可接收的或甚至是更有用的结窘,但是在實(shí)現(xiàn)這個(gè)標(biāo)簽描述的任何行為之前,應(yīng)該理解其完整的含義并仔細(xì)的權(quán)衡充蓝。
- 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)提供的功能)赤兴。
使用語義化版本管理的軟件必須聲明一個(gè)公開API妖滔。這個(gè)API可以在代碼中聲明,也可以嚴(yán)格存在于文檔中桶良。一旦這個(gè)API定義完成座舍,它應(yīng)該是精確和全面的。
正常版本號(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璧眠。一旦發(fā)布了版本化的包缩焦,就不能修在改該版本的內(nèi)容。任何修改都必須作為新版本發(fā)布责静。
主(Major)版本0(0.y.z)用于初始開發(fā)袁滥。任何事情都可能在任何時(shí)候發(fā)生變化。這個(gè)版本的公開API不應(yīng)該被認(rèn)為是穩(wěn)定的灾螃。
版本1.0.0定義了公共API题翻。這個(gè)版本發(fā)布以后,版本號(hào)增加的方式取決于此公開API及此API變化的方式腰鬼。
補(bǔ)肚对(Patch)版本Z(x.y.Z | x > 0)必須增加,如果只引入向后兼容的錯(cuò)誤修復(fù)熄赡。錯(cuò)誤修復(fù)定義是修復(fù)不正確行為的內(nèi)部更改姜挺。
-
次(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缺虐。
-
主(Major)版本X(X.y.z | X > 0)必須增加,如果向公開API引入任何向后不兼容的更改赏参。
- 它也可能包括此版本和補(bǔ)丁版本級(jí)別的修改志笼。
- 當(dāng)主版本增加時(shí)沿盅,補(bǔ)丁版本和次版本必須重置為0。
-
一個(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.–。
- 標(biāo)識(shí)符只能由ASCII字母數(shù)字和連字符組成
-
構(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呵扛。
- 標(biāo)識(shí)符只能由ASCII字母數(shù)字和連字符組成
-
優(yōu)先級(jí)指的是排序時(shí)版本之間的比較方式。
優(yōu)先級(jí)必須將版本劃分為主筐带、次择份、補(bǔ)丁和預(yù)發(fā)布標(biāo)識(shí)符,按照順序分別比較(構(gòu)建的元數(shù)據(jù)不能表明優(yōu)先級(jí))烫堤。
優(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鸽斟。
當(dāng)主版本拔创、次版本和補(bǔ)丁版本相同時(shí),預(yù)發(fā)布版本的優(yōu)先級(jí)低于正常版本富蓄,例如:1.0.0-alpha < 1.0.0剩燥。
-
具有相同主、次和補(bǔ)丁版本的兩個(gè)預(yù)發(fā)布版本的優(yōu)先級(jí)必須將每個(gè)以點(diǎn)分隔的標(biāo)識(shí)符從左到右進(jìn)行比較,直到發(fā)現(xiàn)差異時(shí)根據(jù)下面的規(guī)則決定:
- 僅由數(shù)字組成的標(biāo)識(shí)符按數(shù)字進(jìn)行比較。
- 帶有字母或連字符的標(biāo)識(shí)符按ASCII排序順序進(jìn)行詞法比較。
- 數(shù)字標(biāo)識(shí)符的優(yōu)先級(jí)總是低于非數(shù)字標(biāo)識(shí)符掺涛。
- 如果前面的標(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。