phpcs命令不可用是因为composer仅将其安装到vendor目录且未加入path,需用./vendor/bin/phpcs调用或全局安装并配置对应bin路径;ci中需显式设置--severity=5等参数控制退出码,否则默认返回0导致检查失效。

能集成,但默认不生效——必须手动配置脚本、路径和退出码逻辑,否则CI里永远“看起来没问题”。
phpcs 命令找不到?别直接敲 phpcs
Composer 安装 squizlabs/php_codesniffer 后,phpcs 不会自动进系统 PATH。直接运行就报 command not found。
- 最稳妥方式:Linux/macOS 用
./vendor/bin/phpcs,Windows 用vendor\bin\phpcs.bat - 全局安装可选,但得确认
~/.composer/vendor/bin在 PATH 里(macOS/Linux)或%APPDATA%\Composer\vendor\bin已加进 Windows 环境变量 - 别混用
--global和--dev:Composer 会直接拒绝,报错dev dependencies cannot be installed globally
让 composer test 顺带跑代码检查
把 phpcs 塞进 composer.json 的 scripts 里,才能统一入口、跨平台调用。
- 在
scripts中加一条:"phpcs": "vendor/bin/phpcs --standard=PSR12 --report=full --severity=5 src/" - 注意
--severity=5:这是关键,让 warning 及以上级别触发非零退出码,CI 才会失败中断 - 别写成
"phpcs": "phpcs ..."—— 跨平台失效,Windows 下没phpcs这个可执行文件 - 想合并检查?加个
"lint": ["@phpcs", "@phpstan"],再composer lint一键拉起
CI 里 phpcs 总是成功?问题出在退出码
默认 phpcs 只输出报告,不管有没有错误都返回 0。GitLab CI 或 GitHub Actions 一看退出码是 0,就认为“检查通过”,实际可能一堆 warning。
- 必须显式加
--report=full(或--report=checkstyle)+--severity=5 - 避免只用
--report=emacs或--report=source:它们不控制退出码逻辑 - CI 脚本里别漏掉
--分隔符,比如script: composer phpcs -- --extensions=php,否则参数传不进工具 - 如果用 GitLab CI,注意 YAML 缩进:写成
script: phpcs src/是错的,得是script: ./vendor/bin/phpcs src/(路径必须明确)
标准配置别靠命令行硬写
每次改 --standard=PSR12 都要改所有脚本和 CI 配置,极易不同步。项目根目录一个 phpcs.xml 就能接管全部行为。
- 文件名必须是
phpcs.xml或phpcs.xml.dist,phpcs.yml无效 - 基础内容至少包含:
<rule ref="PSR12"></rule>,再加<exclude-pattern>tests/*</exclude-pattern>排除测试目录 - VS Code 用户注意:PHP Intelephense 插件不会自动找 vendor 里的
phpcs,必须手动设intelephense.completion.snifferPath指向./vendor/bin/phpcs - 别把
phpcbf(自动修复)放进 CI 自动跑——它可能误改嵌套结构或类型声明缩进,CI 只做检查,修复留给人手执行
真正容易被忽略的是:CI 流程里没加 composer dump-autoload,或者 phpcs.xml 里 <file></file> 路径写成绝对路径,导致本地能跑、CI 找不到文件。这些细节一错,整个质量门禁就形同虚设。











