记一次依赖安装报错的刨根问底之旅

458 阅读2分钟

前段时间使用UMajs CLI 创建项目后,在安装依赖时居然报错了!!报错信息如下:

WechatIMG453.png

在这里我连续使用了“居然”和两个感叹号来表达我的惊诧之情:明明前段时间我帮人排查问题时还使用CLI创建了项目,当时没这个问题。而且我检查了 CLI 工具和模板工程,在近期都没有发布更新。

于是我找了 UMajs 项目组其它成员(以下简称小伙伴)来帮助我重复同样的操作,都能够安装成功。果然事情并没有这么简单,这个结果让我不禁皱起了眉头,疲惫而又沧桑。

诧异归诧异,问题还是要解决的,看看报错信息吧。不逐行翻译了,报错信息大致如下:

项目的依赖@typescript-eslint/parser@^2.x等包所需要的 eslint 版本是 eslint ^6 或者 eslint ^5,而项目的依赖则是 eslint ^7,这就导致依赖不一致所以 npm 会报错。

问题的真相往往就在血红的 ERR! 之中(如果你习惯性的忽略报错的话,当我没说):虽然明白了问题产生的根本原因,但为什么同样的项目别人没问题?

我想排查到这里,大家和我一样开始怀疑是环境问题,遂联系小伙伴执行 node -v 查看 node 版本号。让人意外的是,我俩的 node 版本居然都是 v14.16.1 。 emmmm,这也不奇怪,毕竟开发中你永远不知道意外的 bug 和需求变更哪个先到。

事情仿佛陷入了僵局。我现在有点想找老板蹭根烟。再降个版本试试,还不行就去蹭烟,我暗暗下了决心。

nvm use 12 之后再次尝试,问题居然解决了!我也失去了蹭烟的机会,隐约还有点小失落。

那么新问题又来了,为啥我本地 node v12 可以安装、node v14 不行,而小伙伴无论是 v12 还是 v14 都没有报错呢?

这个时候我突然注意到一个细节:

1635841930561-328.png

所以说 bug 往往隐藏在细节之中,居然是 npm 版本不一致导致的,至此真相大白了:npmv7 版本新增了一个特性: proper-peerdependencies-support,会为我们自动安装 peer dependencies,而我上周恰好为了尝鲜 npm/tinknpm 升级到了 v8.1.0 🤔

虽然问题完全解决了,但我还是很惆怅:这可能就是(不够了解 peer dependencies 的)探索者所需要付出的代价吧。