composer脚本需在composer.json的"scripts"中定义命令,先安装dev-dependency工具(如phpcs、phpstan),再用@php vendor/bin/tool $@传参并确保exit code透传,ci中用composer exec或包装脚本避免默认忽略错误码。

Composer脚本里怎么调用PHP_CodeSniffer或PHPStan
Composer本身不执行代码检查,它只是帮你把检查工具(比如 phpcs、phpstan、psalm)的命令封装成可复用的脚本。关键在 composer.json 的 "scripts" 段里写对命令,并确保工具已作为 dev-dependency 安装。
常见错误是直接写 "cs": "phpcs" 却没装 phpcodesniffer,结果运行 composer run cs 报错 Command "phpcs" is not defined —— 这说明命令没被识别,不是脚本写错了,而是工具根本没装进 vendor/bin/。
- 先装工具:
composer require --dev squizlabs/php_codesniffer或composer require --dev phpstan/phpstan - 再定义脚本:
"scripts": {"cs": "phpcs src/ --standard=PSR12"} - 运行时用
composer run cs(Composer 2.4+)或composer cs(旧版) - 如果想跳过 vendor/autoload.php 自动加载(比如检查启动阶段就报错的项目),加
--no-plugins参数
如何让Composer脚本支持传参(比如指定目录或级别)
Composer原生不解析脚本参数,但可以用 [@php](https://getcomposer.org/doc/articles/scripts.md#event-objects) 占位符 + 环境变量绕过限制。更实用的做法是:用 shell 包一层,把 $@ 透传过去。
例如你想运行 composer run cs -- src/Tests 并让它真正传参给 phpcs,就得在 composer.json 里这样写:
"scripts": {
"cs": "@php vendor/bin/phpcs --standard=PSR12 $@"
}
注意两点:一是必须用 @php 显式调用 PHP 解释器(避免 Windows 下找不到 .bat/.sh);二是 $@ 只在 Linux/macOS 有效,Windows 需换用 %*,所以跨平台项目建议改用包装脚本(如 bin/cs)。
- Windows 用户若坚持用 JSON 写脚本,得写两套:
"cs": "@php vendor/bin/phpcs --standard=PSR12 %*" - 参数带空格?用引号包裹整个参数段,如
composer run cs -- "src/My Class" - 别在脚本里硬编码路径,用
${PWD}或./更安全
为什么脚本执行后退出码总是0,导致CI里检查失败不中断
这是最隐蔽的问题:Composer 默认忽略子命令的退出码。哪怕 phpstan analyse 找出10个错误、返回非0状态,composer run stan 仍显示成功(exit code 0),CI 流程就继续往下走。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
根本原因是 Composer 脚本默认以“事件监听器”方式执行,不继承子进程退出码。解决办法只有一个:显式用 exec 替换默认行为(仅限 shell 脚本)。
- Linux/macOS:把脚本改成
"stan": "exec vendor/bin/phpstan analyse src/" - Windows 不支持
exec,只能靠包装批处理(bin/stan.bat)并用exit /b %errorlevel%透传 - 或者统一用
composer exec(Composer 2.5+):composer exec -- phpstan analyse src/,它会正确传播退出码 - CI 中务必加
set -e(bash)或ExitOnFailure(PowerShell)兜底
多个检查工具串联执行,失败时要立刻停止
用 && 连接命令是最直接的方式,但要注意 Composer 脚本里不能直接写多条命令(JSON 不支持分号或换行)。必须包进 shell -c 或单独抽成脚本文件。
例如想按顺序跑 phpcs → phpstan → tests,任一失败就停,推荐做法是新建 bin/check:
#!/usr/bin/env bash vendor/bin/phpcs "$@" && \ vendor/bin/phpstan analyse "$@" && \ vendor/bin/phpunit "$@"
然后在 composer.json 里只写 "check": "bin/check"。这样既清晰,又避免 JSON 转义麻烦,还能自由加日志、颜色控制、超时判断等逻辑。
- 别用
"check": "phpcs && phpstan && phpunit"—— 缺少路径和 vendor/bin 前缀,99% 失败 - 如果某些检查允许失败(比如 psalm level 5 先跳过),用
|| true显式忽略,别依赖“可能成功” - CI 中建议加
timeout 300s bin/check防止某项卡死
脚本看似简单,但退出码透传、参数传递、跨平台兼容这三点,几乎每个团队都踩过至少两次坑。










