npm package-lock的管理

有同學(xué)提到說(shuō)package-lock.json文件很容易產(chǎn)生沖突,我們不妨先放下這個(gè)問(wèn)題,先來(lái)看看為什么我們需要package-lock.json.

package-lock.json簡(jiǎn)介

package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or package.json. It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.

以上摘自官方文檔,義譯一下就是

package-lock.json會(huì)在npm更改node_modules目錄樹或者package.json時(shí)自動(dòng)生成的。它準(zhǔn)確的描述了當(dāng)前項(xiàng)目npm包的依賴樹,并且在隨后的安裝中會(huì)根據(jù)package-lock.json來(lái)安裝,保證是相同的一個(gè)依賴樹,不考慮這個(gè)過(guò)程中是否有某個(gè)依賴有小版本的更新。

這里有個(gè)很重要的點(diǎn)就是,package-lock.json記錄的是一個(gè)依賴樹,而不是你直接在package.json中的依賴項(xiàng)。和直接在package.json中鎖死版本不一樣的地方在于,package.json中只是鎖死了依賴項(xiàng)的版本,而沒(méi)有鎖死依賴項(xiàng)的依賴的版本,這里就是變數(shù)的地方。如果不對(duì)整個(gè)依賴樹做鎖定,那前后編譯出來(lái)的應(yīng)用版本可能是不一樣的,有可能開發(fā)時(shí)能正常工作,而到了線上卻不能工作。

所以很明顯的package-lock.json是很符合我們的訴求的。我們需要讓后面每一次install都是相同的版本,打出來(lái)的包都有著相同的依賴,這對(duì)于我們項(xiàng)目的穩(wěn)定性、前后一致性是非常重要的。

如何解決package-lock的沖突呢?

不要試圖刪除package-lock.json來(lái)解決一些問(wèn)題,這樣會(huì)破壞package-lock.json的作用。

package-lock是工具自動(dòng)生成的一個(gè)文件內(nèi)容,對(duì)于這種自動(dòng)生成的文件最好的辦法還是交由工具去處理,而不是手工一個(gè)一個(gè)的去處理產(chǎn)生的沖突。

在開發(fā)過(guò)程中,合并的時(shí)候如何如果出現(xiàn)了沖突,在merge conflicts的階段,只需要從主分支中checkout去package-lock.json,再以此為基礎(chǔ),重新安裝新分支中需要的依賴。

git checkout dev -- package-lock.json;
npm install lodash --save;

這樣讓npm自動(dòng)的去維護(hù)package-lock.json。當(dāng)然上面的步驟同樣也適用于rebase過(guò)程。

我相信這個(gè)辦法可以很好的解決package-lock.json沖突的問(wèn)題,并且團(tuán)隊(duì)合作中,做merge或者rebase操作的人可以通過(guò)查看package.json的變更知道新安裝了哪些依賴包,來(lái)重新安裝,也可以很好的解決這個(gè)問(wèn)題。

校驗(yàn)package-lock.json的正確性

在按照上面的步驟解決完package-lock.json的沖突后,code reviewer對(duì)package-lock.json的正確性需要做一次校驗(yàn),按照gerrit中的說(shuō)法就是verify的過(guò)程。將被review的代碼拉到本地做一次npm install,檢查package-lock.json是否有modified,如果沒(méi)有modify說(shuō)明提交的package-lock.json是一份正確的文件。

有一個(gè)問(wèn)題,package-lock.json中的resolved字段會(huì)被不同環(huán)境中的npm registry改寫,這樣會(huì)導(dǎo)致很多的沖突。所以在經(jīng)過(guò)正確性校驗(yàn)的過(guò)程中,可能會(huì)因?yàn)楸镜豶egistry的配置問(wèn)題會(huì)導(dǎo)致package-lock.json處于modified狀態(tài)。所以為了規(guī)避這個(gè)問(wèn)題,需要在團(tuán)隊(duì)內(nèi)統(tǒng)一npm registry,可以在項(xiàng)目根目錄中使用.npmrc來(lái)配置項(xiàng)目級(jí)別的registry來(lái)進(jìn)行統(tǒng)一。

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

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • 上一篇文章中提到了幾個(gè)前端界的版本大佬,這不,上個(gè)月 Node 又發(fā)布了 8.0 版本。 Node 8 這次升級(jí)有...
    6ed7563919d4閱讀 1,579評(píng)論 0 0
  • 今天碰到了一些NPM相關(guān)的問(wèn)題, 花了些時(shí)間搞清楚, 記錄一下. 關(guān)于NPM包依賴的扁平化 (flatten) 接...
    柳正來(lái)閱讀 2,912評(píng)論 1 1
  • 那段日子,是其他班同學(xué)穿著學(xué)士服、帶著大蓋帽合影后,瘋狂的把他們拋向蔚藍(lán)天空后拖著行李箱走出校門的日子。 記住,是...
    魔西魔西閱讀 278評(píng)論 0 3
  • ** 1.結(jié)構(gòu)與表現(xiàn)相關(guān)內(nèi)容簡(jiǎn)介** 網(wǎng)頁(yè)制作中 結(jié)構(gòu)(HTML)、表現(xiàn)(CSS)、行為分離(JavaScript...
    單純的土豆閱讀 1,082評(píng)論 0 0

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