💡
原文中文,约5000字,阅读约需12分钟。
📝
内容提要
在使用 Yarn workspace 管理的 monorepo 项目中,子包执行依赖安装时,根目录的 preinstall 钩子未被触发。分析发现,使用 `yarn --cwd ../ preinstall` 命令因路径问题导致死循环。最终,通过将相对路径改为绝对路径,并使用 `git rev-parse --show-toplevel` 获取项目根目录,解决了该问题。
🎯
关键要点
- 在 yarn workspace 管理的 monorepo 项目中,子包执行依赖安装时,根目录的 preinstall 钩子未被触发。
- 使用 'yarn --cwd ../ preinstall' 命令因路径问题导致死循环,CPU 占用率达到 100%。
- 分析发现,yarn workspace 共享包的 preinstall 被执行时,已被拷贝到子包的 node_modules 中,导致 --cwd ../ 不指向项目根目录。
- 通过将相对路径改为绝对路径,并使用 'git rev-parse --show-toplevel' 获取项目根目录,解决了该问题。
- 在 yarn v2 中新增了一个 --top-level 属性,专门为了解决类似的问题。
❓
延伸问答
在 Yarn workspace 中,为什么子包的 preinstall 钩子没有被触发?
因为子包执行依赖安装时,根目录的 preinstall 钩子未被触发,导致需要在每个子包中单独添加该钩子。
使用 'yarn --cwd ../ preinstall' 命令时出现死循环的原因是什么?
因为该命令在执行时不断触发自己,导致进程数量激增,最终造成 CPU 占用率达到 100%。
如何解决 Yarn workspace 中的 preinstall 钩子问题?
通过将相对路径改为绝对路径,并使用 'git rev-parse --show-toplevel' 获取项目根目录来解决该问题。
Yarn v2 中新增的 --top-level 属性有什么作用?
该属性专门用于解决类似于 preinstall 钩子未触发的问题,简化了路径管理。
在 Yarn workspace 中,如何确保共享包的 preinstall 钩子正常执行?
只需确保在使用共享包的地方执行 preinstall 钩子,而不必在共享包自身中添加该钩子。
Yarn 的 cwd 参数是如何工作的?
cwd 参数指定当前工作目录,Yarn 会从该目录向上查找 package.json 文件,以确定项目根目录。
➡️