有同學(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)一。