为什么不要在一个项目里混用包管理工具

48 阅读2分钟

背景:

今天遇到一个很奇怪的问题,测试环境和本地有一个时间范围选择的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版本解决);