Monorepo项目中如何配置Husky仅对应目录变更时触发对应脚本
实现方案说明
Husky本身是Git钩子的管理工具,没有内置路径匹配能力,但可以配合Git原生命令或Lerna的内置能力快速实现你要的目录变更触发对应测试的需求,以下是两种可直接落地的配置方案:
方案1:原生Git+Shell实现(无需额外依赖)
直接修改.husky/pre-push钩子文件内容如下:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" # 读取本次推送的变更文件列表,无上游分支时默认和main分支对比 CHANGED_FILES=$(git diff --name-only HEAD @{push} 2>/dev/null || git diff --name-only HEAD main) # 匹配front目录变更 if echo "$CHANGED_FILES" | grep -q "^front/"; then echo "=== front目录有变更,执行测试 ===" cd front && yarn test && cd .. fi # 匹配app目录变更 if echo "$CHANGED_FILES" | grep -q "^app/"; then echo "=== app目录有变更,执行测试 ===" cd app && yarn test && cd .. fi
该方案适合子项目数量少、目录固定的场景,不需要依赖Monorepo工具的能力即可运行。
方案2:Lerna内置能力实现(适配复杂Monorepo)
如果你的项目已经用Lerna管理,可以直接用Lerna自带的变更包识别能力,简化配置,.husky/pre-push内容如下:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" # 仅对本次推送有变更的子包执行test命令 lerna run test --since HEAD@{push} --include-dependencies
参数说明:
--since HEAD@{push}:自动识别和上游分支对比有变更的子包,仅对这些子包执行指定命令--include-dependencies:可选参数,若开启,某个子包的依赖包有变更时,也会执行该子包的测试,避免依赖变更引发的问题
补充说明
如果后续子项目数量增加,更推荐使用方案2,Lerna会自动识别所有子包的变更和依赖关系,不需要手动维护每个子项目的路径匹配规则。
内容的提问来源于stack exchange,提问作者Castro Crea
相关产品推荐
相关产品推荐

