有同學(xué)提到說package-lock.json文件很容易產(chǎn)生沖突遏餐,我們不妨先放下這個(gè)問題扣蜻,先來看看為什么我們需要package-lock.json.
package-lock.json簡介
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會在npm更改node_modules目錄樹或者package.json時(shí)自動生成的诫欠。它準(zhǔn)確的描述了當(dāng)前項(xiàng)目npm包的依賴樹艰赞,并且在隨后的安裝中會根據(jù)package-lock.json來安裝意述,保證是相同的一個(gè)依賴樹提佣,不考慮這個(gè)過程中是否有某個(gè)依賴有小版本的更新。
這里有個(gè)很重要的點(diǎn)就是荤崇,package-lock.json記錄的是一個(gè)依賴樹拌屏,而不是你直接在package.json中的依賴項(xiàng)。和直接在package.json中鎖死版本不一樣的地方在于术荤,package.json中只是鎖死了依賴項(xiàng)的版本倚喂,而沒有鎖死依賴項(xiàng)的依賴的版本,這里就是變數(shù)的地方瓣戚。如果不對整個(gè)依賴樹做鎖定端圈,那前后編譯出來的應(yīng)用版本可能是不一樣的,有可能開發(fā)時(shí)能正常工作子库,而到了線上卻不能工作舱权。
所以很明顯的package-lock.json是很符合我們的訴求的。我們需要讓后面每一次install都是相同的版本刚照,打出來的包都有著相同的依賴刑巧,這對于我們項(xiàng)目的穩(wěn)定性、前后一致性是非常重要的无畔。
如何解決package-lock的沖突呢啊楚?
不要試圖刪除package-lock.json來解決一些問題,這樣會破壞package-lock.json的作用浑彰。
package-lock是工具自動生成的一個(gè)文件內(nèi)容恭理,對于這種自動生成的文件最好的辦法還是交由工具去處理,而不是手工一個(gè)一個(gè)的去處理產(chǎn)生的沖突郭变。
在開發(fā)過程中颜价,合并的時(shí)候如何如果出現(xiàn)了沖突,在merge conflicts的階段诉濒,只需要從主分支中checkout去package-lock.json周伦,再以此為基礎(chǔ),重新安裝新分支中需要的依賴未荒。
git checkout dev -- package-lock.json;
npm install lodash --save;
這樣讓npm自動的去維護(hù)package-lock.json专挪。當(dāng)然上面的步驟同樣也適用于rebase過程。
我相信這個(gè)辦法可以很好的解決package-lock.json沖突的問題,并且團(tuán)隊(duì)合作中寨腔,做merge或者rebase操作的人可以通過查看package.json的變更知道新安裝了哪些依賴包速侈,來重新安裝,也可以很好的解決這個(gè)問題迫卢。
校驗(yàn)package-lock.json的正確性
在按照上面的步驟解決完package-lock.json的沖突后倚搬,code reviewer對package-lock.json的正確性需要做一次校驗(yàn),按照gerrit中的說法就是verify的過程乾蛤。將被review的代碼拉到本地做一次npm install
每界,檢查package-lock.json是否有modified,如果沒有modify說明提交的package-lock.json是一份正確的文件家卖。
有一個(gè)問題盆犁,package-lock.json中的resolved字段會被不同環(huán)境中的npm registry改寫,這樣會導(dǎo)致很多的沖突篡九。所以在經(jīng)過正確性校驗(yàn)的過程中,可能會因?yàn)楸镜豶egistry的配置問題會導(dǎo)致package-lock.json處于modified狀態(tài)醋奠。所以為了規(guī)避這個(gè)問題榛臼,需要在團(tuán)隊(duì)內(nèi)統(tǒng)一npm registry,可以在項(xiàng)目根目錄中使用.npmrc來配置項(xiàng)目級別的registry來進(jìn)行統(tǒng)一窜司。