做者:Kostas Bariotis翻譯:瘋狂的技術宅前端
原文:https://blog.logrocket.com/wh...git
未經容許嚴禁轉載程序員
在本文中,咱們將介紹 package-lock.json
爲何重要,以及如何與 NPM CLI 一塊兒使用。github
NPM v5 引入了 package-lock.json
, 將其做爲捕獲在任意時刻安裝的確切依賴樹的機制。面試
這會有助於在不一樣環境中進行協做,在這種環境中,你但願每一個人都爲項目的特定版本獲取依賴項以獲得同一棵依賴樹。express
package.json
使用語義版本定義所需的依賴項及其各自的版本。可是語義版本控制可能很棘手。npm
考慮一個表示爲 "express": "^4.16.4"
的依賴項。json
該模塊的發佈者(不使用 package-lock.json
)將安裝版本爲 4.16.4 的 Express ,由於他們安裝了最新版本。segmentfault
若是 express
在我下載該模塊並嘗試安裝依賴項時發佈了新版本,則能夠下載最新版本。bash
這些信息 caret
符號能夠準確地告訴咱們。
上面的問題是,若是 4.17.x 版本存在一個錯誤,則個人本地設置將會失敗,可是發佈商的版本將繼續在舊版本上正常運行。
在生產環境中可能會發生一樣的事情,而且你不知道爲何它會失敗。
在 NPM v5 以前,你須要使用 shrinkwrap
。它與 package-lock.json
不一樣,由於它能夠與模塊一塊兒發佈到 NPM 註冊表中,而 package-lock.json
則不容許。
若是全部成員均可以使用 NPM+5,則最好對未發佈的項目使用 package-lock.json
。
可是,若是你正在開發模塊並打算髮布它,則須要考慮是否要讓客戶端安裝你指定的確切依賴關係樹,或者是否但願靈活一些。 這裏是該主題的更詳細的版本。
所以, package-lock.json
將描述當前安裝的確切依賴樹。該格式在NPM文檔中進行了描述。
經過將其提交到你的 VCS(絕對應該這樣作),能夠返回歷史記錄並複製確切的依賴關係樹。
確保始終向你的 VCS 提交 package-lock.json
,以在任何給定時間跟蹤確切的依賴樹。
它將確保下載你項目並嘗試安裝依賴項的全部客戶端都可以得到徹底相同的依賴樹。此外這也確保你可以檢出先前的提交併複製每一個提交的依賴狀態。
package.json
與package-lock.json
要確保你不去直接更改 package-lock.json
。這將由 NPM 自動處理。它將對 package.json
的更改反映到package-lock.json
,並保持最新。
可是隻有在使用 NPM 的 CLI 進行更改時,纔會發生這種狀況。若是你手動更改 package.json
,則不要指望 package-lock.json
會更新。要始終使用 CLI 命令,例如 install
,uninstall
等。
當你首次在新項目中使用 NPM 時,它會自動生成 package-lock.json
。
而後,你就能夠正常使用 NPM 了。
能夠將 install
與要安裝的模塊名一塊兒使用,這將更改 package.json
和 package-lock.json
,由於依賴關係樹將會發生變化。
考慮下面的例子:
npm install express body-parser cors
install
將嘗試安裝與 package-lock.json
相關的全部依賴項。
這裏的關鍵是,若是 install
註冊已通過期,則能夠更改 package-lock.json
。
若是有人手動更改 package.json
(例如,他們刪除了一個軟件包,由於這只是刪掉一行),那麼下次有人運行 npm install
時,它將更改 package-lock.json
以反映對先前軟件包的刪除。
這可能很棘手。想象一下,拉取項目的最新版本,當運行 npm install
獲取最新信息時,卻發現樹中進行了許多毫無心義的更改。
你樹中的更改極可能對審覈你的代碼更改的人沒有意義。
與 install
相似,但須要用要被刪除的模塊名稱做爲參數。這將同時更改 package.json
和 package-lock.json
。
update
將會讀取 package.json
,用來查找能夠更新的全部依賴項。隨後它將構造一個新的依賴關係樹並更新 package-lock.json
。
還記得語義版本控制嗎?假設咱們在 package.json
中有一個依賴項,狀態爲 ^1.4.5
。
字符 ^
告訴 NPM 檢查在 1.X.X
範圍內是否有較新版本,若是有,則進行安裝。相似地,〜
字符只會出如今熱修復程序或 1.4.X
上。
你也能夠省略特殊字符並保留固定版本,這會減小 package-lock.json
的幫助(但並不是沒有用)。
ci
將安裝與 package-lock.json
有關的全部依賴項,相似於 install
。這裏的主要區別在於,在任何狀況下都不會更改 package-lock.json
。
其目的是要在某些環境中使用,例如構建服務器時以自動方式進行安裝等。
使用 package-lock.json
時,請記住如下關鍵要點:
不要在沒有參數的狀況下使用 npm install
來獲取依賴關係,因此請使用 npm ci
。你能夠用 npm install
安裝特定的依賴項。
僅在須要本地依賴關係樹時,甚至在本地開發環境中,均可以在全部地方使用 npm ci
。
爲你依賴關係的更新作一個重複的任務,例如每個月一次。 (或者,你能夠用 dependabot 之類的服務,但請確保測試覆蓋率良好)。
這樣,你能夠確保你的依存關係是最新的,並避免技術債。
npm install
和 npm ci
之間的區別:https://stackoverflow.com/que...