Published on
1109

pnpm-lock.yaml的版本号导致安装报错问题

Authors
  • avatar
    Name
    小辉辉
    Twitter

前言

前端项目工程自从用上了pnpm,对于多包开发方便了很多,尤其是依赖安装这一块,不得不说速度快了很多,lock文件非常稳定,升级某个包的版本改动量基本上是最少。

直到后面某一次项目组里突然有人反馈pnpm安装失败了,错误提示如下:

 WARN  Your pnpm-lock.yaml was generated by a newer version of pnpm. It is a compatible version but it might get downgraded to version 6.0

上面意思翻译过来大致意思是pnpm-lock.yaml文件由一个比较新的pnpm版本生成,这是一个兼容的版本,但是如果安装的话,版本会被降至6.0。

这个时候去看pnpm-lock.yaml文件会发现lockfileVersion配置的值是6.1,配合上面的提示就说的明白了,那就是说pnpm执行安装后,lockfileVersion会从6.1降至6.0版本。

虽然说这是个WARN警告,但是实际上下面紧接着就是依赖错误的提示,最终结果就是安装会失败。

分析

第一反应就是在群里问下有没有人遇到类似情况,问了就发现居然有其他同事已经遇到过了,他们的解决方案就是手动改了pnpm-lock.yaml文件,把6.1改成6.0,这样安装就不会出错了。

虽然说这样可以跳过安装失败的问题,但是每次安装都有执行一次这个操作的话岂不是非常麻烦?所以就决定详细了解下这个问题的根源,先是看了下这个6.1版本的提交记录只有同事A,其他同事每次提交都是6.0版本。这样就好办了,说明A同事的pnpm版本肯定有问题,首先想到的是应该是个很新的版本,赶紧了解了下,A安装的版本是8.6.0,再统计下其他同事的版本,发现A的版本并不是最高的,有同事还是8.15.5的版本。

这么一搞,就纳闷了,说明这个lockfileVersion版本并不是跟着pnpm的版本一直往上升级的。于是赶紧去官方的文档看看有没有相关的文档说明,找了半天没有找到,后面终于在github里面找到了一处讨论,里面也是遇到了8.6.0版本这个的问题,摘录下里面关键的说明:

Sometimes there are some new fields in the lockfile but otherwise the lockfile is backward compatible, so it can be used with previous versions of pnpm. In this case, a new settings field was added to the lockfile. However, we had to change the lockfile version back as there is a bug in pnpm v8. It thinks that 6.1 is a breaking change.

此处的翻译如下:

有时锁定文件中会有一些新字段,但除此之外,该锁定文件是向后兼容的,因此可以与早期版本的 pnpm 一起使用。在这种情况下,锁定文件中添加了一个新的 settings 字段。然而,由于 pnpm v8 中存在一个 bug,它认为 6.1 是一个破坏性变更,我们不得不将锁定文件版本改回来。

这里解释了为什么高版本的pnpm版本号是6.0,中间某个版本却是6.1的原因。

除此之外,还在github上找到了一处类似上述报错的issue,同样摘录比较关键的说明如下:

v8.6.0, v8.6.1, v7.33.0 had the new lockfile version. If you created a lockfile with these versions and need to use the lockfile with older pnpm versions, you may manually edit the lockfileVersion field in pnpm-lock.yaml to 6.0. From v8.6.2 and at least untill v9, pnpm will keep the lockfileVersion field set to 6.0 for compatibility with all pnpm v8 versions.

两个回答的作者都是pnpm模块的成员,可以说还是有权威的。

结论

这里就翻译下最后的一段摘录作为文章结论:

在使用版本 v8.6.0、v8.6.1 和 v7.33.0 生成了新的锁定文件版本(6.1)后,如果需要将该锁定文件与较旧的 pnpm(8.0 ~ 8.6.1) 版本一起使用,您可以手动编辑 pnpm-lock.yaml 文件中的 lockfileVersion 字段,将其设置为 6.0。从 v8.6.2 版本开始,至少持续到 v9 版本,pnpm 将保持 lockfileVersion 字段设置为 6.0(安装时自动会对6.1进行调整),以确保与所有 pnpm v8 版本兼容。

我们项目最后比较简单的做法是将A的版本升级到了8.6.2之后的版本来舍弃(6.1)这个中间版本。