介紹
如果把npm更新到了5以上,默認就會有package-lock.json。很多時候我們直接把它ignore或直接從項目中刪除,然後直接從npm install來安裝依賴。那麼坑就此埋下了,尤其是在多人協作的時候,很有可能出現的情況是依賴報錯了。那麼這個文件存在的目的是什麼呢?
總結
先給出結論:
- package-lock.json是^5.x.x自帶生成的
- 你應該使用package-lock來確保依賴的兼容性
- 在使用git等源碼管理系統的時候,應該把這個文件帶上
- 不要只爲了npm install而把package-lock給刪了
目的
package-lock的引入是爲了避免因爲依賴更新導致npm install不同的結果。舉例來說,我們安裝express:npm install express --save,最新版本是是4.15.4,而在package.json中是這樣寫的
"express": "^4.15.4"
其中^表示的是最低版本,也就是npm默認後面版本兼容前面的。但結果往往並不盡然。比如後面修復了bug,發佈小版本4.15.5,那麼其他人獲取代碼然後安裝的就是4.15.5,這就導致同一套package.json,最後安裝的包可能不一樣,而這有可能在後期帶來意想不到的兼容性問題。
package-lock格式
截取一段來看下,發現其中包含了具體的版本,哈希鹽值integrity,因此有效保證了所有人,任何時間安裝的版本都是一致的。
"express": {
"version": "4.15.4",
"resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz",
"integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=",
"requires": {
"accepts": "1.3.3",
"array-flatten": "1.1.1",
"content-disposition": "0.5.2",
"content-type": "1.0.2",
"cookie": "0.3.1",
"cookie-signature": "1.0.6",
"debug": "2.6.8",
"depd": "1.1.1",
"encodeurl": "1.0.1",
"escape-html": "1.0.3",
"etag": "1.8.0",
"finalhandler": "1.0.4",
"fresh": "0.5.0",
"merge-descriptors": "1.0.1",
"methods": "1.1.2",
"on-finished": "2.3.0",
"parseurl": "1.3.1",
"path-to-regexp": "0.1.7",
"proxy-addr": "1.1.5",
"qs": "6.5.0",
"range-parser": "1.2.0",
"send": "0.15.4",
"serve-static": "1.12.4",
"setprototypeof": "1.0.3",
"statuses": "1.3.1",
"type-is": "1.6.15",
"utils-merge": "1.0.0",
"vary": "1.1.1"
}
},
附錄
更多請參考原文鏈接:https://medium.com/coinmonks/everything-you-wanted-to-know-about-package-lock-json-b81911aa8ab8