可通过配置 composer.json 的 post-update-cmd 脚本在 composer update 后自动执行 PHP_CodeSniffer 扫描,需显式指定 src/ 等路径、确保 vendor/bin/phpcs 可用,并透传退出码以避免 CI 误判。

composer update 后自动触发 PHP_CodeSniffer 扫描
Composer 本身不支持更新后直接执行自定义命令,但可以通过 scripts 配置 + post-update-cmd 事件实现。关键在于:这个钩子只在 composer update(或 install)完成、依赖已写入 vendor/ 后触发,此时代码风格工具才能正确加载项目依赖和配置。
- 确保已安装
phpcs(推荐用squizlabs/php_codesniffer或phpstan/phpstan等兼容的扫描器)到dev环境:composer require --dev squizlabs/php_codesniffer
- 在
composer.json的scripts段落添加:"scripts": { "post-update-cmd": [ "@php vendor/bin/phpcs --standard=PSR12 src/ tests/" ] } - 注意路径必须显式指定(如
src/),不能只写.,否则可能误扫vendor/或node_modules/;若项目用phpstan,命令改为vendor/bin/phpstan analyse src/ tests/
避免 post-update-cmd 在 CI 中重复执行
CI 流水线常同时运行 composer install 和 composer update,而 post-update-cmd 会在两者之后都触发,导致扫描跑两次甚至失败(比如 CI 里没装 phpcs)。这不是 bug,是设计行为。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把扫描命令抽成独立脚本(如
bin/check-style),再在scripts中调用:"post-update-cmd": ["@php bin/check-style"]
- 在脚本开头加检测:
if [ -f vendor/bin/phpcs ]; then ... fi,避免找不到命令时报错中断 - CI 配置中显式禁用钩子:
composer install --no-scripts,再单独运行bin/check-style,更可控
post-update-cmd 不会捕获 phpcs 的非零退出码
默认情况下,即使 phpcs 扫出错误并返回 1,post-update-cmd 仍认为整个 composer update 成功——这会让 CI 误判为通过,实际代码风格已违规。
- 必须在命令末尾加
&& exit $?或使用set -e(Bash 脚本中)显式传递退出状态 - 推荐改用包装脚本而非内联命令,例如
bin/check-style最后一行写:vendor/bin/phpcs --standard=PSR12 src/ tests/ || exit 1
- 如果用
phpcbf自动修复,注意它默认不报错,需加--report=checkstyle并配合解析工具判断是否真有可修复项
为什么不用 post-autoload-dump?
有人尝试用 post-autoload-dump 触发扫描,但它在 autoload.php 生成后就执行,早于 vendor/ 完整就绪,且不保证所有包已解压完毕。尤其当项目含 classmap 或 psr-4 映射未生效时,phpcs 可能因类找不到而静默失败或误报。
-
post-update-cmd是唯一能确保vendor/目录完整、所有bin命令就位的时机 - 如果扫描需加载自定义规则(如项目级
ruleset.xml),务必确认该文件路径在post-update-cmd阶段可被phpcs正确读取(建议放项目根目录,用相对路径引用) - 某些插件(如
hirak/prestissimo)会并发下载包,但post-update-cmd总是在全部完成后才调用,无需额外同步处理

















