背景:
今天遇到一个很奇怪的问题,测试环境和本地有一个时间范围选择的bug,但是同事的电脑里是好的;
第一时间定位到版本差异导致的;因为用到了dayjs和antd,对比发现是antd 版本 不同, 一个是5.14.2,一个是5.11.2, 改成一致,问题解决;
原因:
一般项目里有lock文件,会锁定版本:
例如A 使用 yarn add antd 后 package.json 版本如下antd@^5.9.4(这种只锁定主版本号);此时antd 实际安装为最新版本;然后推送到远程;
此时B 加入项目, 从仓库拉取代码,执行 yarn install;也会安装antd, 但是现在即使antd升级了,安装的也是A最初安装的版本;
但是如果此时B用npm i 来安装,那么他安装的就是antd当前的最新版本了。因为yarn.lock 只对yarn install 下生效;npm i 对应生成的是package.lock;
所以如果一个项目混用包管理工具,那么lock文件也就失去了意义;
进一步调查:
按理说按照此版本号规范,应该是向下兼容的,不会有breakchange, 于是查了下antd的升级日志,发现5.14.2并没有开始多久,那么这个版本啥时候升级的呢?
查了git日志,发现一周前确实有人升级了,经过调查当时是因为要升级某个依赖的版本,于是删除了lock文件,导致了版本升级;
yarn 升级依赖版本的命令:
yarn upgrade antd@5.14.2 // 升级为该版本
其他关联问题:
yarn.lock 冲突解决方式:
先手动解决package.json的冲突,然后执行yarn install, 冲突自动解决;
使用npm的项目如何更新为pnpm: 使用pnpm import,该命令会查找项目下的package.lock 并生成pnpm-lock(如果报错可以尝试切换node版本解决);