版本號組成
node package 版本號由四部分組成:major.minor.patch[-prerelease]
,比如:1.0.2-beta.1
,其中 prerelease
可選。
- major:代表主版本號,通常在需要提交不能向下相容的情況下對該版本號進行升級
- minor:代表次版本號,通常在新增功能時才對該版本號進行升級
- patch:代表修復版本號,升級該版本號通常代表修復一些bug,但沒有新增功能或者存在不向下相容的功能
- prerelease:帶有該版本號的包通常表示在測試階段,尚未穩定,通常不建議使用者安裝。
prerelease 說明: alpha、beta、rc
- alpha: 代表內部測試版,會有很多Bug,是比beta更早的版本,一般不建議對外發布
- beta: 相對alpha版本已有了很大的改進,但還是存在一些缺陷,需要經過多次測試來進一步消除
- rc:Release Candidate顧名思義就是正式釋出的候選版本。和Beta版最大的差別在於Beta階段會一直加入新的功能,但是到了RC版本,幾乎就不會加入新的功能了,而主要著重於除錯! RC版本是最終發放給使用者的最接近正式版的版本,發行後改正bug就是正式版了,就是正式版之前的最後一個測試版
版本釋出最佳實踐
為了幫助依賴您的程式碼的開發人員,我們建議您從 1.0.0 開始您的包版本並按如下方式遞增
major:代表主版本號,通常在需要提交不能向下相容的情況下對該版本號進行升級
minor:代表次版本號,通常在新增功能時才對該版本號進行升級
patch:代表修復版本號,升級該版本號通常代表修復一些bug,但沒有新增功能或者存在不向下相容的功能
prerelease:帶有該版本號的包通常表示在測試階段,尚未穩定,通常不建議使用者安裝。
程式碼狀態 | 階段 | 規則 | 示例版本 |
---|---|---|---|
首次釋出 | 新產品 | 從 1.0.0 開始 | 1.0.0 |
向後相容的缺陷修復 | 補丁版本 | 增加第三個數字 | 1.0.1 |
向後相容的新功能 | 次要版本 | 增加中間數字並將最後一位重置為零 | 1.1.0 |
破壞向後相容性的更改 | 要版本 | 增加第一位數字並將中間和最後一位數字重置為零 | 2.0.0 |
安裝 NPM 時的版本控制
我們經常看到,在 package.json 中各種依賴的不同寫法:
"dependencies": {
"signale": "1.4.0",
"figlet": "*",
"react": "16.x",
"table": "~5.4.6",
"yargs": "^14.0.0"
}
前三個容易理解:
- "signale": "1.4.0":固定版本號
- "figlet": "*":任意版本號(即 >=0.0.0)
- "react": "16.x":匹配主要版本(>=16.0.0 < 17.0.0)
- "react": "16.3.x":匹配主要版本和次要版本(>=16.3.0 <16.4.0)
再看看後面兩個,版本號包含 ~
和 ^
符號:
- ~:當安裝依賴時獲取到有最新版本時,安裝到 x.y.z 中 z 的最新版本。即保持主版本號、次版本號不變的情況下,保持修訂號的最新版本
- ^:當安裝依賴時獲取到由最新版本時,安裝到 x.y.z 中 y 和 z 都為最新版本。即保持主版本號不變的情況下,保持次版本號、修訂版本號為最新版本。
當主版本號為 0 的情況,會被認為是一個不穩定版本,情況與上面不同:
- 主版本號和次版本號都為 0: ^0.0.z、~0.0.z 都被當作固定版本,安裝依賴時均不會發生變化。
- 主版本號為 0: ^0.y.z 表現和 ~0.y.z 相同,只保持修訂號為最新版本。
除此以外,還包含以下規則:
>
:接受高於指定版本的任何版本>=
:接受等於或高於指定版本的任何版本<=
:接受等於或低於指定版本的任何版本<
:接受低於指定版本的任何版本=
:接受確切的版本-
:接受一定範圍的版本,例如 2.1.0 - 2.6.2||
:組合集合,例如 < 2.1 || > 2.6- 可以合併其中一些符號,例如 1.0.0 || >= 1.1.0 < 1.2.0 即使用 1.0.0 或從 1.1.0 開始但低於 1.2.0 的版本。
使用 npm 安裝
npm install
分5個階段執行:
- 讀取 package.json 檔案裡宣告的專案所需的包和版本
- 分析 package.json 依賴關係
- 下載 npm 包和依賴項。
- 安裝 npm 包和依賴項。
把 npm 包和依賴項的變化寫進 package-lock.json
npm ci
分6個階段執行:
- 檢查 package-lock.json檔案,如果不存在則退出
- 刪除 node_modules 資料夾 (相當於刪除已經安裝的 npm 包)
- 讀取 package-lock.json 以確定專案特定的包版本和依賴項
- 安裝這些特定版本的 npm 和依賴項
- 透過對比 package-lock.json 驗證安裝的完整性
- 不更新 package-lock.json。
注意事項: - 僅當 package-lock.json 或者 npm-shrinkwrap.json 存在於工作目錄中時,該命令才能正常執行;如果該 package-lock 檔案丟失,命令無法執行
- package-lock.json 或 npm-shrinkwrap.json 中宣告的安裝包應該也存在於 package.json 檔案宣告裡,否則它將退出。
npm install
vs npm ci
npm install
會在你允許的版本里安裝最新的版本,例如 package.json 檔案宣告的依賴包A版本 ^1.1.2,當 A存在 1.2.0 時,實際會安裝 1.2.0; 而npm ci
則會嚴格按照 package-lock.json 裡宣告的版本進行版本安裝- 所以
npm ci
不更新 package-lock.json,而npm install
則可能會更新 package-lock.json npm ci
在進行安裝時會刪除 node_modules 的內容,而npm install
則不會
總之,npm ci
能嚴格按照宣告版本進行安裝,是一種比較安全的安裝方式。
總結
本文內容講了 NPM的版本介紹、版本釋出、版本安裝和使用 npm 工具安裝 NPM 的知識。後續我們會講到其他版本管理(如 Yarn、Pnpm)工具安裝 npm 的內容以及它們之間的聯絡和對比~
參考
- https://github.com/canvasT/blog/issues/2
- https://tsejx.github.io/node-guidebook/overview/ecology/npm-v...
- https://nodejs.cn/npm/packages-and-modules/contributing-packa...