You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 01:54:03