介绍
如果把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