grumphp 不会自动注册 git hook,需手动在 composer.json 中配置 post-install-cmd 和 post-update-cmd 脚本并执行 grumphp git:hook:install --force;同时确保 grumphp.yml 正确配置 tasks 且路径、依赖、触发条件无误,ci 环境应改用 vendor/bin/grumphp run 显式执行。

GrumPHP 不能直接靠 Composer 自动触发预提交检查,必须手动配置 Git hook —— 否则 git commit 时根本不会运行任何检查。
为什么 composer require grumphp 后 git commit 没反应
很多人执行 composer require --dev phpro/grumphp 就以为万事大吉,结果 git commit 照常通过。这是因为 GrumPHP 默认不自动注册 Git hook,它只是把二进制文件和配置放好,等着你“拉闸通电”。
常见错误现象:git commit 无任何 PHP 语法、CS 或单元测试提示,grumphp run 却能手动跑出问题。
- GrumPHP 的
grumphp命令行工具默认不监听 Git 生命周期,它只是个检查执行器 - Git hook(如
.git/hooks/pre-commit)必须存在且可执行,否则 Git 完全忽略它 -
composer install或composer update不会自动写 hook 文件,除非你显式启用phpro/grumphp的脚本钩子
必须启用 composer-scripts 才能自动安装 hook
GrumPHP 提供了 post-install-cmd 和 post-update-cmd 脚本,在 Composer 安装/更新后自动调用 grumphp git:hook:install。但这个功能默认关闭,需手动在 composer.json 中声明。
实操建议:在 composer.json 的 "scripts" 区块里补上这两行:
"scripts": {
"post-install-cmd": [
"@php ./vendor/bin/grumphp git:hook:install --force"
],
"post-update-cmd": [
"@php ./vendor/bin/grumphp git:hook:install --force"
]
}
注意点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--force很关键:避免因已有 hook 冲突导致安装失败 - 路径必须写
./vendor/bin/grumphp,不能只写grumphp—— Windows 和某些 CI 环境中$PATH不一定包含vendor/bin - 如果项目已存在
.git/hooks/pre-commit,GrumPHP 默认跳过安装;加--force才会覆盖
grumphp.yml 配置决定哪些检查实际生效
即使 hook 装好了,git commit 也可能“静默通过”,原因通常是 grumphp.yml 里没配任何 task,或配了但被条件过滤掉了。
典型配置误区:
- 只写了
tasks:但下面空着,等于“检查零项” - 用了
triggered_by限定文件类型(比如只检查.php),但你改的是.js或README.md,task 直接跳过 - 启用了
phpcs却没装squizlabs/php_codesniffer,GrumPHP 默认忽略缺失的 task,不报错也不提醒 -
phpunittask 默认只跑tests/下的用例,如果你的测试在test/(单数),得显式改config:里的configuration路径
一个最小可用示例(放在项目根目录):
parameters:
bin_dir: "./vendor/bin"
tasks:
phpcs:
standard: "PSR12"
triggered_by: ["php"]
phpstan:
level: 5
configuration: "phpstan.neon"
CI 环境下要小心 hook 被绕过
很多 CI 流水线用 git clone --depth=1 或直接解压代码包,根本不带 .git/hooks/ 目录 —— 这意味着 GrumPHP 的 pre-commit hook 在 CI 里天然失效。
解决思路不是“修 hook”,而是换执行时机:
- CI 脚本里显式加一行:
vendor/bin/grumphp run,作为独立步骤运行 - 不要依赖
git commit触发,因为 CI 通常不走 Git 提交流程 - 若用 GitHub Actions,注意
actions/checkout@v4默认不保留 hooks,也别指望它自动恢复 - 本地开发用 hook,CI 用
grumphp run,两者职责分开更可靠
真正容易被忽略的是:GrumPHP 的配置加载顺序(grumphp.yml → grumphp.yaml → grumphp.json)和工作目录判定逻辑 —— 如果你在子目录执行 git commit,而 grumphp.yml 在父目录,它可能根本读不到配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










