最近Github 10週年在朋友圈裡沸沸揚揚刷屏,小編在工作中卻驚訝的發現不少同事對版本號中的beta和rc沒有概念,使用npm install package@next時,也不清楚next代表的含義。於是,決定寫一篇文章科普一下由 Github 起草的Semver(語義化版本)的相關知識。
實際案例
首先,我們來看看目前最流行的前端框架之一的React最近5個月的版本釋出日誌,截圖來自npmjs.com:
從上圖,我們不難得出幾個結論:
- 軟體的版本通常由三位組成,形如:X.Y.Z
- 版本是嚴格遞增的,此處是:16.2.0 -> 16.3.0 -> 16.3.1
- 在釋出重要版本時,可以釋出alpha, rc等先行版本
- alpha和rc等修飾版本的關鍵字後面可以帶上次數和meta資訊
可以說,React 釋出版本時做的相當到位,版本給人的感覺非常清晰,也很嚴謹。這得益於 Semver(語義化版本) 規範的功勞。那麼,Semver是在什麼場景下出現的呢?它的出現又解決了什麼問題?這裡要和大家科普下“依賴地獄”的概念。
依賴地獄
通俗而言,“依賴地獄”指開發者安裝某個軟體包時,發現這個軟體包裡又依賴不同特定版本的其它軟體包。隨著系統功能越來越複雜,依賴的軟體包越來越多,依賴關係也越來越深,這個時候可能面臨版本控制被鎖死的風險。
因此,Github 起草了一個具有指導意義的,統一的版本號表示規則,稱為 Semantic Versioning(語義化版本表示)。該規則規定了版本號如何表示,如何增加,如何進行比較,不同的版本號意味著什麼。
官網:semver.org/ 中文版:semver.org/lang/zh-CN/
下面是遵從了Semver規範的React依賴圖,截圖來自npm.broofa.com:
可以看出,遵從了Semver規範的包依賴非常清晰,沒有出現迴圈依賴、依賴衝突等常見問題。
版本格式
版本格式:主版本號.次版本號.修訂號,版本號遞增規則如下:
- 主版本號(major):當你做了不相容的 API 修改,
- 次版本號(minor):當你做了向下相容的功能性新增,可以理解為Feature版本,
- 修訂號(patch):當你做了向下相容的問題修正,可以理解為Bug fix版本。
先行版本號及版本編譯資訊可以加到“主版本號.次版本號.修訂號”的後面,作為延伸。
先行版本
當要釋出大版本或者核心的Feature時,但是又不能保證這個版本的功能 100% 正常。這個時候就需要通過釋出先行版本。比較常見的先行版本包括:內測版、灰度版本了和RC版本。Semver規範中使用alpha、beta、rc(以前叫做gama)來修飾即將要釋出的版本。它們的含義是:
- alpha: 內部版本
- beta: 公測版本
- rc: 即Release candiate,正式版本的候選版本
比如:1.0.0-alpha.0, 1.0.0-alpha.1, 1.0.0-beta.0, 1.0.0-rc.0, 1.0.p-rc.1 等版本。alpha, beta, rc後需要帶上次數資訊。
版本釋出準則
列舉出比較實用的一些規則:
- 標準的版本號必須採用XYZ的格式,並且X、Y 和 Z 為非負的整數,禁止在數字前方補零,版本釋出需要嚴格遞增。例如:1.9.1 -> 1.10.0 -> 1.11.0。
- 某個軟體版本發行後,任何修改都必須以新版本發行。
- 1.0.0 的版本號用於界定公共 API。當你的軟體釋出到了正式環境,或者有穩定的API時,就可以釋出1.0.0版本了。
- 版本的優先層級指的是不同版本在排序時如何比較。判斷優先層級時,必須把版本依序拆分為主版本號、次版本號、修訂號及先行版本號後進行比較。
npm包依賴
當執行npm install package -S 來安裝三方包時,npm 會首先安裝包的最新版本,然後將包名及版本號寫入到 package.json 檔案中。
比如,通過npm 安裝 react 時:
{
"dependencies": {
"react": "~16.2.0"
}
}
複製程式碼
專案對包的依賴可以使用下面的 3 種方法來表示(假設當前版本號是 16.2.0):
- 相容模組新發布的補丁版本:~16.2.0、16.2.x、16.2
- 相容模組新發布的小版本、補丁版本:^16.2.0、16.x、16
- 相容模組新發布的大版本、小版本、補丁版本:*、x
npm包釋出
通常我們釋出一個包到npm倉庫時,我們的做法是先修改 package.json 為某個版本,然後執行 npm publish 命令。手動修改版本號的做法建立在你對Semver規範特別熟悉的基礎之上,否則可能會造成版本混亂。npm 考慮到了這點,它提供了相關的命令來讓我們更好的遵從Semver規範:
- 升級補丁版本號:npm version patch
- 升級小版本號:npm version minor
- 升級大版本號:npm version major
當執行 npm publish 時,會首先將當前版本釋出到 npm registry,然後更新 dist-tags.latest 的值為新版本。
當執行 npm publish --tag=next 時,會首先將當前版本釋出到 npm registry,並且更新 dist-tags.next 的值為新版本。這裡的 next 可以是任意有意義的命名(比如:v1.x、v2.x 等等)
OK,現在你應該知道 npm install package@next時next代表的含義了吧!
《IVWEB 技術週刊》 震撼上線了,關注公眾號:IVWEB社群,每週定時推送優質文章。