package-locks 機制簡述

問題

假設(shè)我們安裝 eslint:

npm install --save-dev eslint

安裝完后,在 package.json 里面生成如下模塊版本:

{
  "devDependencies": {
    "eslint": "^5.13.0"
  }
}

然后你把 package.json 提交到代碼庫。過了一段時間,有新人加入到項目里面。他克隆出了代碼,然后本地安裝依賴包 npm install。在他安裝的時候 eslint 已經(jīng)發(fā)布了新的版本5.16.0。那么新人本地安裝的 eslint 版本就會變成5.16.0。這個機制意味著同一份 package.json 在不同時間安裝出來的依賴包有可能不一樣。可能造成的后果就是依賴不一致程序不 work(一種環(huán)境不一致導(dǎo)致的問題)。

解決方案

那么你說我把 package.json 里面的版本寫死不就可以了嗎?雖然這樣,你項目的直接依賴版本固定了,但是你不能保證你安裝的包自己也寫死它的依賴,也就是說 eslint 模塊依賴的包可能會隨著時間升級。為了解決這個問題出現(xiàn)了 package-lock.json。當(dāng)你 npm install 的時候,同時會生成一個 package-lock.json,這個文件記錄了你運行 npm install 命令那一個時刻的模塊依賴樹(就是你安裝的所有包的版本等信息)。當(dāng)你把這個文件提交到代碼庫之后,其他人在其他時間克隆出代碼再 npm install 的時候,npm 會看到有 package-lock.json 文件,那么就會按照其描述的依賴樹安裝包。也就是說通過這一個機制保證同一份 package.json 在不同時間安裝出的包依賴樹是一致的。

但是我要更新我依賴的包呢?當(dāng)你使用 npm update 更新現(xiàn)有包,或者 npm install 安裝新包后,如果改變了 package.json 那么 npm 同時會更新 package-lock.json。使 package.json 和 package-lock.json 保持某一時刻的一致。

歷史

以上是現(xiàn)有 npm-v6.10.2 的機制,但是這個機制也是經(jīng)過演化,一開始出來 package-lock.json 的時候,其行為并不完全按上面的機制運行,具體歷史可以看這個貼子:https://www.zhihu.com/question/62331583/answer/275248129

參考文獻(xiàn)

  1. 官方文檔
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容