记录并分析分析一个yarn存在6年之久的bug

1. 介绍

yarn 是 Apache 下的一个分布式包管理工具,专门用于管理大型项目的依赖关系。但是,自 2015 年发布以来,yarn 一直存在一个 bug,这个 bug 会使 yarn 出现“无法安装依赖包”的情况。这个 bug 也是 yarn 在社区中最常见的 bug 之一。

2. bug 的表现

yarn 的这个 bug 表现的非常隐蔽,通常用户会在 yarn 安装某个包时遇到以下错误:

Error: ENOENT: no such file or directory

at Error (native)

这种错误一般会出现在正常工作一段时间之后。比如,用户在一个项目中使用了 yarn 作为包管理工具,运行了一段时间后,yarn 就会出现“无法安装依赖包”的错误。

3. bug 的原因

3.1 隐藏的 node_modules 文件夹

yarn 的这个 bug 的原因非常复杂,最核心的原因在于 yarn 中存在一个隐藏的 node_modules 文件夹。在 yarn 安装依赖包时,它不会直接将依赖包放在项目下的 node_modules 中,而是会先把依赖包放在一个隐藏的 node_modules 文件夹下。这个行为和其他的包管理工具不同,也是最容易造成问题的地方。

3.2 文件夹不存在的问题

yarn 在安装新的依赖包时,它会先检查这个依赖包是否已经存在于隐藏的 node_modules 文件夹里。如果没有,它会先把依赖包下载到这个文件夹里,再拷贝到项目的 node_modules 文件夹中。但是,yarn 在检查文件夹是否存在时,有一定的延迟,如果这个文件夹正在被 yarn 本身或者其他进程使用,就可能会导致它检查不出来,从而下载重复的依赖包。

3.3 缓存的清理问题

除此之外,yarn 也存在一个缓存机制,会将已经下载的依赖包缓存起来以备后用。但是,yarn 并没有一个自动的清理机制,可能会导致缓存中存在已经过期的依赖包。当用户需要安装这个依赖包时,yarn 可能会从缓存里面读取这个依赖包,但是这个依赖包可能已经过期了,导致安装依赖失败。

4. 解决方案

4.1 清除 node_modules 文件夹

要解决 yarn 的这个 bug,最简单的方法就是清空项目下的 node_modules 文件夹,然后重新运行 yarn install 命令。但这种方法并不能完全解决问题,只能起到缓解作用。

4.2 卸载 yarn

有些用户尝试了清空 node_modules 文件夹,但还是无法解决问题。这时候,卸载 yarn 并使用其他包管理工具可能是更好的解决方案。

4.3 避免并发安装

为了避免下载重复的依赖包,可以尝试减少并发的安装数量。可以使用 --flat 并 --prod 选项,这样 yarn 在安装依赖包时,会把所有依赖包安装在同一级目录中,减少隐藏的 node_modules 文件夹的使用。同时,也可以调整并发安装的数量,比如将并发度调整为 1,避免并发读写造成的问题。

4.4 定期清理缓存

yarn 的缓存机制也是需要定期清理的。可以在每个版本发布之前,手动清除缓存或者使用缓存清理插件进行自动清理,保障缓存中只存储最新的依赖包。

5. 结论

yarn 的这个 bug 在应用中会带来很大的问题,但是解决方法并不复杂。使用上述的方法进行优化,可以避免大部分问题,为项目的开发工作提供更加稳定的依赖管理。