package.json与package-lock.json

任何事情都不是凭空发生,特别在是技术这件事情上;任何事情都是由最最基础发展而来的,只要追本溯源就能解决问题。

问题的产生

起因:项目走自动化构建不成功,说一个包连接github失败,但是在package.json里面根本没找到这个包,在代码里面也没看到(神奇脸.jpg)

猜测:可能是哪个包关联了吧。

结论:确实在package-lock.json里面发现了这个包,是项目中另一个包引入的问题,看到项目并没有用,就删除了,自动化是成功解决了。问题来了,为什么会出现这种情况,package.json里面没有,但是package-lock.json里面有。

package.json和package-lock.json

package.json就是我们在使用npm init就会产生的json文件,记录当前状态下实际安装的各个npm package的具体来源和版本号。

package-lock.json是在npm i或者npm update就会产生的json文件(npm 5.x.x或者更大就会有这个文件)

为什么会出现package-lock.json?

都知道,我们以前用package.json直接管理包,很方便,但是为什么会在后面版本出现一个package-lock.json文件,毕竟存在即合理。比如package.json里面安装包“express”:“^ 4.15.4”,这个意思是只要保证大版本就会被安装,这样的设计会出现同样的package.json但是不同的开发者安装的包不一样的情况,可能开发者A在今天安装是4.15.4,过1一个月开发者B加入,拉代码安装,这时候express更新了,变成了4.16.1,那么这时候开发者B安装的就是4.16.1。理论上是兼容的,但是可能会产生不同的结果,正因为这个不确定性,package-lock.json出现了,看lock英文就知道意思了。

package-lock.json锁定每个包的版本,让不同的开发者安装的包是同一个版本,所以建议把package-lock.json提交到项目远程,不要禁用它。

我们都习惯使用cnpm来操作,但是cnpm对package-lock.json没用,也就是只有npm的命令才会更改package-lock.json里面的内容。所以建议使用npm i(install的简写)操作更新。

回到上面的问题:为什么会出现package.json里面没有,但是还存在在package-lock.json里。其实是因为操作不当,一个开发者手动删除了package.json里面的东西(自己觉得没用了),最后其他同事使用cnpm i下载包,那么package-lock.json里面的东西就一直没变。

参考资料:

https://segmentfault.com/a/1190000017239545

https://docs.npmjs.com/configuring-npm/package-lock-json.html

你可能感兴趣的:(npm)