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
相关产品推荐
相关产品推荐

