一文讀懂 NPM 版本

specialCoder發表於2024-11-22

版本號組成

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個階段執行:

  1. 讀取 package.json 檔案裡宣告的專案所需的包和版本
  2. 分析 package.json 依賴關係
  3. 下載 npm 包和依賴項。
  4. 安裝 npm 包和依賴項。
  5. 把 npm 包和依賴項的變化寫進 package-lock.json

    npm ci

    分6個階段執行:

  6. 檢查 package-lock.json檔案,如果不存在則退出
  7. 刪除 node_modules 資料夾 (相當於刪除已經安裝的 npm 包)
  8. 讀取 package-lock.json 以確定專案特定的包版本和依賴項
  9. 安裝這些特定版本的 npm 和依賴項
  10. 透過對比 package-lock.json 驗證安裝的完整性
  11. 不更新 package-lock.json。
    注意事項:
  12. 僅當 package-lock.json 或者 npm-shrinkwrap.json 存在於工作目錄中時,該命令才能正常執行;如果該 package-lock 檔案丟失,命令無法執行
  13. package-lock.json 或 npm-shrinkwrap.json 中宣告的安裝包應該也存在於 package.json 檔案宣告裡,否則它將退出。

npm install vs npm ci

  1. npm install 會在你允許的版本里安裝最新的版本,例如 package.json 檔案宣告的依賴包A版本 ^1.1.2,當 A存在 1.2.0 時,實際會安裝 1.2.0; 而 npm ci 則會嚴格按照 package-lock.json 裡宣告的版本進行版本安裝
  2. 所以 npm ci不更新 package-lock.json,而 npm install 則可能會更新 package-lock.json
  3. 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...

相關文章