npm 語義化版本控制

NPM 版本控制

爲了在軟件版本號中包含更多意義,反映代碼所作的修改,產生了語義化版本,軟件的使用者能從版本號中推測軟件作的修改。npm 包使用語義化版控制,咱們可安裝必定版本範圍的 npm 包,npm 會選擇和你指定的版本相匹配(latest)最新版本安裝。
npm 的版本號由三部分組成:
主版本號次版本號補丁版本號。變動不一樣的版本號,表明不一樣的意義:html

  • 主版本號(major):軟件作了不兼容的變動(breaking change 重大變動);
  • 次版本號(minor):添加功能或者廢棄功能,向下兼容;
  • 補丁版本號(patch):bug 修復,向下兼容。

有時候爲了表達更加確切的版本,還會在版本號後面添加標籤或者擴展,來講明是預發佈版本或者測試版本等。好比 3.2.3-beta-3vue

常見的標籤有 :git

標籤 意義 補充
demo demo版本 可能用於驗證問題的版本
dev 開發版 開發階段用的,bug 多,體積較大等特色,功能不完善
alpha α版本 用於內部交流或者測試人員測試,bug較多
beta 測試版(β版本) 較α版本,有較大的改進,可是仍是有bug
gamma (γ)伽馬版本 較α和β版本有很大的改進,與穩定版相差無幾,用戶可以使用
trial 試用版本 本軟件一般都有時間限制,過時以後用戶若是但願繼續使用,通常得交納必定的費用進行註冊或購買。有些試用版軟件還在功能上作了必定的限制。
stable 穩定版
csp 內容安全版本 js庫經常使用
latest 最新版本 不指定版本和標籤,npm 默認安最新版

更多關於標籤的內容npm

查看標籤:json

npm dist-tags ls <pkg>
npm dist-tags ls vue

獲得:安全

beta: 2.6.0-beta.3
csp: 1.0.28-csp
latest: 2.6.10

安裝帶標籤的版本bash

npm i <pkg>@<tag>
npm i vue@beta # 安裝 2.6.0-beta.3

版本號變動規則

  1. 版本號只升不降,不得在數字前加0,好比 2.01.2 不容許的;
  2. 0.y.z,處於開發階段的版本;
  3. 第一個正式版版本每每命名爲 1.0.0;
  4. 先行版本必須在補丁版本以後添加,好比 2.3.7-0,0表示先行版本,和補丁版本用-分隔;
  5. 版本的比較依次比較主版本次版本補丁版本先行版本,直到第一個能得出比較結果爲止;
  6. 不當心把一個不兼容的改版當成了次版本號發行了該怎麼辦?一旦發現本身破壞了語義化版本控制的規範,就要修正這個問題,並發行一個新的次版本號來更正這個問題而且恢復向下兼容。即便是這種狀況,也不能去修改已發行的版本。

NPM版本計算器post

如何處理即將棄用的功能?

棄用現存的功能是軟件開發中的屢見不鮮,也一般是向前發展所必須的。但當你棄用公共API的一部分時,你應該作兩件事:
(1)更新文檔以便使用者知道這個變化。
(2)發行不包含棄用功能的次版本。在新主版本中徹底移除棄用功能前,至少應有一個不包含棄用功能的次版本發佈,以便使用者可以平滑過渡到新的API。測試

如何更新版本號?不用手動修改 package.json。而是用以下命令:版本控制

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]
  1. newversion: 直接給一個版本號;
  2. major: 主版本增長1;
  3. premajor: 預備主版本,主版本增長1,增長先行版本號;
  4. prelease: 預先發布版本,先行版本號增長1;

git 和 npm version 結合

手動更改版本號

執行 npm version <version> -m 'xx %s xx' 改變npm版本的同時,會執行一次 git commt -m 'xx %s xx'並用版本號打一個tag,%s 會替換成版本號,前提是版本庫是乾淨的(clean)

自動更新版本

.git/hooks目錄內,新建post-commit,輸入如下內容:

#!/bin/sh
COMMIT_MSG="$(git log --pretty=format:"%s" -1 head)"
echo "$COMMIT_MSG" | grep  -q  "^[0-9]"
if [ $? -ne 0 ];then
   # 自動修改 patch
  echo $(npm version patch)
fi

在執行 git commit -m 'message'後,會檢測message是不是版本號(y.x.z的形式),不是,則執行 npm version patch更新補丁版本,打一個tag。

若是想自動修改次版本,post-commit 的內容便可。

版本運算符

版本運算符指定了必定範圍的版本。
主要有~^-<<=>>==版本運算符。

~ 版本號 ----- 指定主版本號或者次版本號相同

~ + 只含主版本 --- 主版本相同;
~ + 含有次版本 --- 主版本和次版本號相同。

版本範圍 匹配版本
~3 3.x 或者 3.0.0 <= v < 4.0.0
~3.1 3.1.x 或者 3.1.0 <= v <3.2.0
~3.1.2 3.1.2 < v < 3.2.0

指定的版本範圍含有預發佈版本,只會匹配和完整版本號相同的預發佈版本。
~3.1.3-beta.2 匹配 3.1.3-beat.3 不匹配 3.1.4-beat-2

npm i lodash@~3 # 安裝 3.10.1
npm i lodash@~3.9 # 安裝 3.9.3
npm i lodash@~3.9.1 # 安裝 3.9.3
npm i lodash@~3.8.0 # 安裝 3.8.0

^ 版本號 --- 第一個非零 版本號相同

版本範圍 匹配版本 補充
^3.1.5 3.1.5 <= v < 4.0.0
^0.3.6 0.3.6 <= v < 0.4.0
^0.0.2 0.0.2 <= v < 0.0.3
^3.x.x 3.0.0 <= v < 4.0.0 版本號缺乏的位置,會被 0 填充
^4.2.x 4.2.0 <= v < 4.3.0

npm 安裝包時,默認使用 ^ 匹配版本。

安裝主版本號爲 3 的最新版本:

npm i lodash@^3 # 安裝 3.10.1
npm i lodash@^3.9 # 安裝 3.10.1
npm i lodash@^3.8.0 # 安裝 3.10.1

~ vs ^

版本範圍 含義 匹配的版本 說明
~3.3.0 與3.3.0類似 3.3.0 <= v < 3.4.0 主版本和次版本相同
^3.3.0 與3.3.0兼容 3.3.0 <= v < 4 主版本相同

同一個版本號,^ 能匹配的範圍大些,更加激進。

例子

npm i lodash@^3.3.0 # 安裝 3.10.1
npm i lodash@~3.3.0 # 安裝 3.3.1

~ 和 ≈ 差很少,可將 ~ 理解成類似,這樣就分辨和理解了,~指定的是類似版本
^ 可理解成兼容版本

- 指定精確範圍

版本範圍 匹配版本 補充
2.0.0 - 3.2.7 2.0.0 <= v <= 3.2.7 - 先後有空格
0.4 - 3 0.4.0 <= v <= 3.0.0 缺乏的版本號,被 0 填充
npm i vue@"1 - 1.9" # 安裝 1.0.28

版本號比較器

版本範圍 匹配版本 補充
<2.2.0 小於2.2.0 的版本
<=2.0.0 小於等於 2.0.0 的版本
>4.2.0 大於4.2.0 的版本
>=4.2.0 大於等於 4.2.0 的版本
=4.3.0 等於 4.3.0 的版本

\ 是轉義字符。

npm i lodash@\<3.5 # 安裝 3.4.0
npm i lodash@\<=3.5 # 安裝 3.5.0
npm i lodash@\>3.5 # 安裝 4.17.11
npm i lodash@\>=3.5 # 安裝 4.17.11
npm i vue@">1 <2.3" # 安裝 2.2.6

分組 ||

或者的關係鏈接兩個版本範圍,極少使用。

npm i vue@"^0.7 || ~2" # 安裝 2.6.10

參考

依賴的版本
版本號管理策略&&使用npm管理項目版本號
語義化版本2.0
whats-the-difference-between-tilde-and-caret-in-package-json

相關文章
相關標籤/搜索