在composer.json的scripts中添加如"cs:check": "phpcs --standard=PSR12 src/ tests/"即可调用PHP_CodeSniffer,前提是已通过composer require --dev squizlabs/php_codesniffer安装且vendor/bin/phpcs可执行。

Composer 脚本里怎么调用 PHP_CodeSniffer
直接在 composer.json 的 "scripts" 里加一条命令就行,但得注意执行路径和依赖是否就绪。PHP_CodeSniffer(简称 PHPCS)本身不内置在 Composer 中,必须先装好,否则脚本会报 command not found。
常见写法:
"scripts": {
"cs:check": "phpcs --standard=PSR12 src/ tests/"
}
这里 phpcs 是可执行命令,不是 PHP 函数;--standard=PSR12 指定规则集;src/ tests/ 是要检查的目录。如果项目没全局安装 PHPCS,就得确保它作为 dev 依赖存在:
composer require --dev squizlabs/php_codesniffer- 安装后,
phpcs命令会出现在vendor/bin/phpcs,Composer 脚本默认把vendor/bin加入 PATH,所以可以直接写phpcs
为什么 run-script 后提示 Class 'PHP_CodeSnifferRuleset' not found
这是 autoloader 没加载到 PHPCS 自身类,典型于用 php -f vendor/squizlabs/php_codesniffer/autoload.php 手动引入时路径写错,或 PHPCS 版本与 PHP 版本不兼容(比如 PHPCS 4.x 要求 PHP ≥7.4)。
更稳妥的做法是别手动 require,而是走 Composer 提供的 bin 包机制:
- 确认
vendor/bin/phpcs文件存在且可执行(Linux/macOS 下chmod +x有时是必须的) - 不要在脚本里写
php vendor/squizlabs/php_codesniffer/autoload.php这类路径引用 - 若用 Windows,确保
.bat文件没被杀毒软件误删 ——vendor/bin/phpcs.bat缺失会导致同样错误
怎么让 cs:check 只检查改动的文件(Git 集成)
PHPCS 本身不读 Git 状态,得靠 shell 命令组合。Composer 脚本支持内联 shell,但要注意跨平台兼容性 —— Windows cmd 对管道和反引号支持弱,建议统一用 bash 兼容写法,并限制在 CI 或开发机上运行。
示例(只检查当前分支相对于 main 的新增/修改 PHP 文件):
"cs:staged": "git diff --cached --name-only --diff-filter=AM | grep '\.php$' | xargs -r phpcs --standard=PSR12",
"cs:unstaged": "git status -s | awk '$1 ~ /^[MA]$/ && $2 ~ /\.php$/ {print $2}' | xargs -r phpcs --standard=PSR12"
注意点:
-
xargs -r在无输入时不执行phpcs,避免报错 -
grep '\.php$'中的双反斜杠是 JSON 字符串转义需要,实际生效的是单个. - CI 环境中推荐用
git diff origin/main...HEAD替代main,避免分支名硬编码
PHP-CS-Fixer 和 PHPCS 能不能一起跑
能,但别混用同一套配置。PHPCS 是检查器(linter),PHP-CS-Fixer 是修复器(fixer),它们规则虽有重叠(如空格、括号),但实现逻辑不同。强行用 PHPCS 报错 + CS-Fixer 自动修,容易出现“修了又报”或“越修越错”。
建议分工明确:
-
cs:check:只用 PHPCS,保持只读、只反馈 -
cs:fix:用 PHP-CS-Fixer,且加--dry-run --diff先预览,再决定是否加--force - 两者共用同一标准?PSR-12 可以,但需分别配置:
phpcs --standard=PSR12vsphp-cs-fixer fix --rules=@PSR12
最常被忽略的是:PHPCS 的 --report=checkstyle 输出能被 CI 工具解析,而 PHP-CS-Fixer 默认输出是 human-readable 文本,集成进 Git hook 或 CI 时得额外处理格式。


















