如何在子目录安装npm依赖?解决脚本触发全局安装问题
其实你碰到的是yarn工作区模式下的两个常见"坑":
内置命令优先级冲突:
install是yarn的核心内置命令,哪怕你在scripts里自定义了同名脚本,运行yarn run install时,yarn有时会优先触发内置的yarn install(也就是全量安装工作区所有依赖),而非执行你的自定义脚本——这是工具本身的命令优先级判定逻辑导致的。Workspaces自动向上识别:就算你在脚本里cd到子包执行
yarn,只要根目录配置了workspaces,yarn会自动向上找到根目录的package.json,默认按照工作区规则安装所有包的依赖,不会只处理当前子目录的内容。
给你两个最直接的方案,按需选择:
方案一:修改脚本名+禁用工作区模式
把根目录package.json里的脚本改名(避开内置命令),同时加上--no-workspaces参数强制yarn只处理当前子包:
"scripts": { "install:subpkg": "cd packages/my-package && yarn install --no-workspaces" }
然后执行命令:yarn run install:subpkg
方案二:用yarn workspace原生命令(更推荐)
如果你的根目录已经正确配置了workspaces(比如"workspaces": ["packages/*"]),直接用yarn自带的workspace命令就能精准安装指定子包:yarn workspace my-package install
注意这里的my-package是子包package.json里的name字段值,不是文件夹名。这个方法不用写自定义脚本,一步到位,还能彻底避开命令冲突问题。
额外提醒:如果之前误触发了全量安装,只需删掉根目录和子包的node_modules,再运行上面的命令即可。
内容的提问来源于stack exchange,提问作者Red Baron

