Package.json 与 Package-lock.json
记录一下, 关于npm install
时依赖包的生成与更新问题.
我的项目环境: 已搭建了vue-cli 脚手架, 版本 4.5.2
版本说明
很多软件发布时, 都会有一个版本, 例如: 上面提到的vue-cli脚手架, 版本是: 4.5.2
4 : 是主版本, 又称"大版本"
5 : 是次版本, 又称"小版本"
2 : 是修订版本号, 就是 4.5 的第几次修改
一般情况下, 当软件有里程碑式的更新(也就是很大的改动), 才会改动大版本
如果一次性新增/修改了不少文件或特性时, 会改动小版本
如果只是修改一些Bug, 小问题, 会改动修订版本号
在package.json文件中, 会出现以下3种版本号的写法:
- 以
^
开头的版本号 - 以
~
开头的版本号 - 纯版本号, 没有特殊字符
符号
^
: 代表支持当前版本 以及 更高的版本(向后兼容), 重点: 大版本号必须相同. 例如: 版本^4.5.2
, 代表支持4.5.2, 也支持4.5.3、4.5.4、 4.6.4、 4.7.4、 4.9.9 等4.x.x
, 但不支持 5.x.x
等更高的版本
符号
~
: 代表支持当前版本 以及 更高的版本(向后兼容), 重点: 大版本号和小版本号必须相同. 例如: 版本~4.5.2
, 代表支持 4.5.3、4.5.4、4.5.5 等4.5.x
,但不支持 4.6.x
、4.7.x
,更不支持5.x.x
等更高的版本
纯版本号: 代表仅支持当前版本。例如: 版本
4.5.2
,代表仅支持4.5.2
,不支持4.5.3
、4.5.4
,更不支持5.x.x
等更高的版本
两个文件的由来
运行命令npm init
会生成package.json。该文件是记录项目的依赖包名, 包版本等信息
运行命令npm install
会根据 package.json 的记录来安装依相应的依赖包,依赖包会被安装到目录node_modules
下
同时, 也会生成一个文件: package-lock.json, 该文件是记录
并锁定
依赖包的版本, 包的来源等
记录
package.json 和 package-lock.json 都具有记录依赖包名和版本的作用.
区别:
- package.json 仅仅是记录自己的项目需要的直接依赖。
- packge-lock.json 不仅是记录自己项目的直接依赖, 还记录了直接依赖的依赖.
直接依赖的依赖: 有些项目的直接依赖包, 并不是独立的, 也是依赖于别人的包, 而这些别人的包不会记录在package.json, 但是会记录在package-lock.json中
锁定
例如: 程序员小A
从git上拉了一个项目, 并通过 npm install
生成安装 package.json
上的包, 其中一个包的版本为^1.1.3
, 当前生成的依赖包与项目代码完全兼容, 可以正常运行.
后来小A
花了几个月时间, 对该项目迭代升级, 添加了很多功能, 也能正常运行, 便将项目拷贝给了程序员小B
. 注意,在这几个月期间1.1.3
这个包, 官方进行了更新升级到了2.0.1
, 但是小A
并没有更新.
小B
拿到这个项目后, 通过 npm install
生成安装 package.json
上的包 (npm install 默认会安装最新版本的包), 此时报错了, 原因是 小B
安装的是最新版的2.0.1
的包, 而这个包恰巧不兼容小A
迭代后的项目。
此时就出现了,在不同的时间, 安装的包与项目不兼容
. 正是因此, 才推出了 package-lock.json
这个文件.
首先, package-lock.json
是 npm 5
版才出现的, 里面记录了包名, 版本, 包的来源等信息.
当第一次
运行命令npm install
时, 根据package.json
生成了node_modules
和 package-lock.json
当第二次 及 以后
运行命令npm install
时, 会自动判断 package.json 中包的大版本是否变化.
大版本没有变化, 则根据 package-lock.json
来安装生成包.
大版本发生变化, 则根据 package.json
来安装生成包, 并更新 package-lock.json
文件
这就是package-lock.json 的锁定作用, 可以确保在不同时间, 不同环境(包来源) 都能保证包的一致性
好了, 这是我理解的package 和 package-lock. 如果有说错的地方, 可留言指正, 我们可以一起进步