一、问题出现
安装依赖如果使用npm或者yarn命令都会先根据package.lock.json文件或者yarn.lock.json文件安装。如果没有这两个文件,则会根据package.json文件的依赖版本安装最新的版本。 这也是为什么一个依赖在package.json里面是^8.1.3, 但是在执行npm install的时候,在保证大的版本号不变的情况下下载的可能是8.1.5版本的原因。依赖安装升级也是有一定的规则的。
二、升级规则
根据package.json 内依赖的版本号进行升级
1. 版本号的含义
npm 模块 完整的版本号为【主版本 . 次要版本 . 补丁版本】
如果模块有变动,通常按照以下规则,更新版本号
1.1.修复 bug,需要更新补丁版本
1.2.新增功能,但是向下兼容,需要更新次要版本
1.3.大变动,向下不兼容,需要更新主版本
2. 版本范围
2.1指定版本
比如 1.2.2,安装时只安装指定版本(遵循 “主版本.次要版本.补丁版本” 的格式规定)
2.2波浪号(tilde)+ 指定版本
比如 ~1.2.2,表示安装 1.2.x 的最新版本(不低于1.2.2),但是不安装 1.3.x,也 就是说,安装时 不改变 大版本号 和 次要版本号
2.3插入号(caret)+ 指定版本
比如 ˆ1.2.2,表示安装 1.x.x 的最新版本(不低于1.2.2),但是不安装 2.x.x,也 就是说,安装时不改变大版本号
2.4 latest
安装最新版本
三、解决方案
这个时候package.json.lock或者yarn.lock.json就起作用了,在node_modules,package.json发生改变时会生成该文件,将会记录下载的到底是模块的哪一个包,然后如果代码移植后不能正常运行,只需要找到该文件中记录的包的具体的版本进行安装就可以解决包的版本带来的问题。
package.json.lock和yarn.lock.json是分别生成的,并无关系,比如存在package.json.lock,不存在yarn.lock.json。使用了yarn命令会根据package.json新生成一个yarn.lock.json,版本和package.json.lock的会存在差异。
四、问题验证
测试一:拉了一个项目 带有package-lock.json
测试结果:安装的版本都是锁定精确的
测试二:删除package-lock.json和yarn.json后安装依赖
测试结果:提示一些更新,原有的某些方法可能会有问题报错,安装的依赖按照规则安装的是大版本下的最新版本
测试三:安装指定版本
有时候我们会选定版本安装依赖,对应的package.json里面就没有^或者~,这时候即使没有lock版本锁定文件,安装时也只会安装当前版本,不会自己升级
测试四:没有yarn.lock.json 使用yarn命令安装
测试结果:yarn.lock.json和package.lock.json没有关联,也会进行一次新的版本锁定