Node.js中npm i和npm ci的區別
在使用npm (Node包管理器)處理Node.js時,安裝專案所需的包非常重要。雖然大多數開發者知道執行npm install或npm i會發生什麼,但npm ci經常出現在關於持續整合和持續交付管道的討論中,以及可重複構建流程中。本文介紹了“npm i”和“npm ci”的區別,以及在什麼情況下應該使用其中一個而不是另一個,以及如何使用它們。
什麼是npm i (或npm install)?
“npm i”實際上是npm install的縮寫,這是應用程式中用於安裝package.json檔案中列出的依賴項的主要命令。
npm i的關鍵功能
1. 安裝package.json中列出的所有依賴項。
2. 如果存在package-lock.json檔案,“npm i”將
- 檢查所有依賴項的版本是否完全相同。
- 這是透過執行命令npm install完成的。如果package.json發生更改,例如新增新的依賴項,則package-lock.json將被更新。
3. 建立或覆蓋package-lock.json檔案,該檔案指示最新安裝的版本。
4. 如果不存在這樣的資料夾,則它將建立一個node_modules資料夾。如果存在這樣的資料夾,它只會複製尚未安裝的必要依賴項。
5. 支援版本靈活性:如果不存在package-lock.json,它將下載package.json版本約束中指定的版本。
何時使用npm i?
- 開發階段:在包含、更新和修剪依賴項時。
- 非CI環境:當版本差異是可以接受的,而不是僅僅需要可重複性時。
什麼是npm ci?
npm ci仍然代表“持續整合”。它是為需要冪等構建的永久無人值守環境構建的,例如在CI/CD工作流中。
npm ci的關鍵功能
必須從具有package-lock.json和node_modules目錄的工作專案中複製一份。npm ci – 如果package-lock.json檔案不可用,則會引發錯誤。
1. 執行乾淨安裝:它會刪除node_modules目錄,並更精確地根據package-lock.json檔案中的內容部署包。
2. 比npm i更快:與npm install相比,如果只使用package-lock.json並繞過版本解析過程,npm ci執行速度快得多,這在管理CI/CD方面很有優勢。
3. 不更新package-lock.json:這也保證了package-lock.json不會更改,因為在部署時您不希望版本更改。
何時使用npm ci?
- CI/CD管道:可重複構建,因為npm ci命令每次都安裝完全相同的依賴項版本。
- 生產環境:確保生產環境複製測試環境中使用的版本。
- 快速設定:由於安裝速度更快,因此適用於安裝至關重要且依賴項更改較少的情況。
npm i和npm ci的主要區別
下表突出顯示了“npm i”和“npm ci”的主要區別:
| 特性 | npm i | npm ci |
| 安裝行為 | 基於package.json安裝,更新package-lock.json | 僅基於package-lock.json安裝,不更新 |
| 版本解析 | 解析版本,可能會更新package-lock.json | 跳過版本解析,安裝速度更快 |
| 可重複性 | 不能保證跨環境一致性 | 確保構建一致性 |
| 用例 | 開發,靈活安裝 | CI/CD,生產,可重複安裝 |
| 依賴項資料夾 | 根據需要更新或建立node_modules | 在安裝之前刪除node_modules |
| 速度 | 較慢(尤其是在大型專案中) |
由於嚴格遵守鎖定檔案而更快 |
示例場景
1. 開發新功能:要安裝依賴項並新增或修改包,請使用“npm i”命令。如果存在任何更改,這也會將package-lock.json更改為新的更改。
2. 在CI/CD中部署Web應用程式:請使用“npm ci”安裝package-lock.json檔案中定義的精確版本。這確保了環境的副本,這對於避免某些部署問題非常重要。
3. 倉庫的新克隆:如果您正在使用新的克隆,並且希望安裝package.json中指定的精確依賴項,請使用npm ci而不是npm i。這樣,安裝速度非常快,並且它們不會從原始碼構建,因此克服了因依賴項版本更新而可能出現的任何潛在問題。
npm i和npm ci的最佳實踐
- 保持package-lock.json更新:確保經常簽入package-lock.json檔案,以確保您擁有正確的依賴項樹。
- 在CI/CD管道中使用npm ci:它專門用於CI/CD場景,在這些場景中,意外使用npm install可能會導致版本不匹配。
- 在本地執行npm i:遠端使用“npm ci”:對於本地開發,“npm i”更為寬鬆,而在遠端構建或部署中,“npm ci”帶來一致性。
結論
npm i和npm ci都是非常重要的命令,在用Node.js編寫的專案中具有特定的作用。雖然npm i對於開發非常有用且適用,但npm ci旨在確定性和理想的生產管道。在本文中,我們演示瞭如何識別開發團隊和運營團隊之間的差異,以及如何利用它來最佳化開發流程並提高部署的可靠性。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP