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

GrumPHP预提交钩子未检测错误,子目录运行异常求助

解决GrumPHP在子目录预提交钩子不检测错误的问题

看起来你遇到的核心问题是:在api子目录下手动执行vendor/bin/grumphp run能正常检测出PHPCS错误,但Git预提交钩子触发时却没有任何错误提示。结合你的目录结构和配置,我来分析几个可能的原因和对应的解决方案:

1. Git钩子的工作目录不匹配

Git的预提交钩子默认是在仓库根目录执行的,而你的GrumPHP配置和依赖都在api子目录里。这就导致钩子执行时,GrumPHP可能找不到正确的配置文件,或者扫描的文件范围不对。

解决方案:调整GrumPHP的工作目录

在你的api/grumphp.yml中添加working_dir参数,明确指定GrumPHP的工作目录为api子目录:

parameters:
  git_dir: ../.
  bin_dir: vendor/bin
  working_dir: ./api  # 让GrumPHP在api目录下执行任务
  ascii:
    failed: ~
    succeeded: ~
tasks:
  phplint: ~
  phpcsfixer2: ~
  xmllint:
    ignore_patterns: []
    load_from_net: true
    x_include: false
    dtd_validation: true
    scheme_validation: true
    triggered_by: [xml]

2. Git钩子脚本未切换到子目录执行

当你在api目录下执行composer install时,GrumPHP会自动在仓库根目录的.git/hooks下生成预提交钩子脚本,但这个脚本可能没有切换到api目录就执行GrumPHP。

解决方案:修改预提交钩子脚本

打开仓库根目录下的.git/hooks/pre-commit文件,在执行GrumPHP命令前添加目录切换:

#!/usr/bin/env sh
# 切换到api子目录
cd api
# 执行GrumPHP的预提交命令
./vendor/bin/grumphp git:pre-commit "$@"

修改后记得给脚本添加执行权限(如果没有的话):

chmod +x .git/hooks/pre-commit

3. Composer配置中的GrumPHP路径不正确

你的composer.json里config-default-path设为./grumphp.yml,这个路径在api目录下是正确的,但如果钩子在根目录执行,这个相对路径就指向了根目录下的grumphp.yml(而实际上不存在)。

解决方案:更新Composer的GrumPHP配置

把config-default-path改成相对于仓库根目录的路径:

"extra": {
  "grumphp": {
    "config-default-path": "./api/grumphp.yml"
  }
}

修改后执行composer dump-autoload或者重新composer install,让GrumPHP更新钩子配置。

额外检查点

  • 确认你的PHPCS Fixer配置文件(比如.php-cs-fixer.dist.php)在api目录下,并且路径正确,确保手动执行和钩子执行时使用的是同一套规则。
  • 预提交输出里的乱码是终端编码问题,建议把终端编码设置为UTF-8,不影响功能但能提升日志可读性。

内容的提问来源于stack exchange,提问作者Henne Van Och

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:10:19