769 words
4 minutes
pnpm lockfile 的不兼容性
2023-10-22

Contents#

问题#

由于 npm 包管理工具较为低效,前端圈出现了很多热门的第三方包管理工具。

pnpmyarn。这些依赖包管理工具为了高效安装、解析依赖包,均会生成独特的lock锁文件。用来指定一个项目中成千上万直接依赖包、间接依赖包的版本信息。

然而,这些独特的lock锁文件不仅无法跨工具兼容,还经常无法同工具跨版本兼容。即导致安装后依赖的版本与锁文件的版本不一致,导致项目无法启动。

  • pnpm 生成的 pnpm-lock.yaml 文件,无法被yarnnpm等工具 1:1兼容,需要使用 pnpm 才能安装
  • pnpm v6.35.1 生成的 pnpm-lock.yaml 文件 lockfileVersion: 5.3,无法被高版本 pnpm v7 读取,也无法被低版本 pnpm v5 读取,甚至跨中版本仍有可能读取失败。
CAUTION

pnpm 锁因为不兼容而读取解析失败的时候,会无视锁文件信息,重新解析依赖关系,并再次生成lockfile。因此,很多项目换包管理器版本重装依赖后,会导致项目无法启动

公司内部项目众多,有的工程需要使用pnpm@6.35.1,有的要使用pnpm@8.5.1,有的要使用yarn@classic

A项目需要 pnpm@6.35.1

B项目需要 pnpm@8.5.1

C项目要需要 yarn@classic

由于包管理工具是全局安装的,如果出现两个项目,需要同一个包管理工具的不同版本时,就需要重新安装对应版本的依赖工具,再进行依赖安装、更新。十分麻烦,而且经常会忘记。若使用了错误的包管理工具进行安装依赖,会导致整个依赖树被重新创建,还得删除整个node_modules后切换正确的包管理工具再进行安装依赖。

解决方案#

对此,node 官方开发了 corepack 包管理工具。在安装、更新依赖之前,可以自动下载(激活)指定的包管理工具,再进行安装。即可实现同时使用一个包管理工具的不同版本。

我们仅需 node > 14.19.0 并启用 corepack corepack enable。 随后在package.json文件写入

{
  "packageManager": "<package manager name>@<version>"
} 

"packageManager": "pnpm@8.5.1"

内网使用#

corepack遇到指定的包管理版本工具,本地不存在的时候,corepack便会尝试从官方源https://registry.npmjs.org/获取。corepack支持更换源,但是我们内网源的网络协议是http的。corepack并没有提供支持 issue

NOTE

内网开发真是艰难,很多问题根本不是问题,但是在内网就是个大坑

对于离线安装,corepack提供了hydrate的安装形式

  1. 在能联网的电脑,执行corepack prepare <package manager name>@<version> -o并将生成的文件corepack.tgz拷贝至内网

  2. 在内网,执行corepack hydrate <path/to/corepack.tgz>,即可离线安装对应版本的包管理工具。

至此,在指定了packageManager的项目内安装依赖,corepack会自动切换到所需的版本,从而保证安装出正确的依赖。

pnpm lockfile 的不兼容性
https://dabuside.github.io/posts/pnpm_lockfile_version/
Author
dabuside
Published at
2023-10-22