npm 語義化版本控制
NPM 版本控制
為了在軟體版本號中包含更多意義,反映程式碼所做的修改,產生了語義化版本,軟體的使用者能從版本號中推測軟體做的修改。npm 包使用語義化版控制,我們可安裝一定版本範圍的依賴,npm 會選擇和你指定的版本相匹配
的最新版本
安裝。
npm 的版本號由三部分組成:
主版本號
、次版本號
、補丁版本號
。變更不同的版本號,表單不同的意義:
- 主版本號(major):軟體做了不相容的變更(breaking change 重大變更);
- 此版本號(minor):新增功能或者廢棄功能,向下相容;
- 補丁版本號(patch):bug 修復,向下相容。
有時候為了表達更加確切的版本,還會在版本號後面新增標籤 或者擴充套件 ,來說明是預釋出版本或者測試版本等。比如3.2.3-beta-3 。
常見的標籤有 :
標籤 | 意義 | 補充 |
---|---|---|
demo | demo版本 | 可能用於驗證問題的版本 |
dev | 開發版 | 開發階段用的,bug 多,體積較大等特點,功能不完善 |
alpha | α版本 | 用於內部交流或者測試人員測試,bug較多 |
beta | 測試版(β版本) | 較α版本,有較大的改進,但是還是有bug |
gamma | (γ)伽馬版本 | 較α和β版本有很大的改進,與穩定版相差無幾,使用者可使用 |
trial | 試用版本 | 本軟體通常都有時間限制,過期之後使用者如果希望繼續使用,一般得交納一定的費用進行註冊或購買。有些試用版軟體還在功能上做了一定的限制。 |
stable | 穩定版 | |
csp | 內容安全裝版 | js庫常用 |
latest | 最新版本 | 不指定版本和標籤,預設安裝新版 |
檢視標籤:
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
安裝帶標籤的版本
npm i <pkg>@<tag>
npm i vue@beta # 安裝 2.6.0-beta.3
版本號變更規則
- 版本號只升不降,不得在數字前加0,比如 2.01.2 不允許的;
- 0.y.z,處於開發階段的版本;
- 第一個正式版版本往往命名為 1.0.0;
- 先行版本必須在補丁版本之後新增,比如 2.3.7-0
- 版本的比較依次比較主版本 →次版本 →補丁版本 →先行版本 ,直到第一個能得出比較結果為止。
- 不小心把一個不相容的改版 當成了次版本號發行 了該怎麼辦?一旦發現自己破壞了語義化版本控制的規範,就要修正這個問題,並發行一個新的次版本號 來更正這個問題並且恢復向下相容。即使是這種情況,也不能去修改已發行的版本。
如何處理即將棄用的功能?
棄用現存的功能是軟體開發中的家常便飯,也通常是向前發展所必須的。但當你棄用公共API的一部分時,你應該做兩件事:(1)更新文件以便使用者知道這個變化。(2)發行不包含棄用功能的副版本 。在新主版本中完全移除棄用功能前,至少應有一個不包含棄用功能的副版本釋出,以便使用者能夠平滑過渡到新API。
如何更新版本號?不用手動修改 package.json。而是用如下命令:
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease | from-git]
- newversion : 直接給一個版本號;
- major :主版本增加1;
- premajor :預備主版本,主版本增加1,增加先行版本號;
- 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