优先用 composer [script-name] 或 composer run [script-name],避免已弃用的 composer run-script;含冒号脚本需加引号如 composer run "ci:lint";传参须用 -- 分隔;php 脚本需显式引入 autoload.php。

别用 composer run-script,它从 Composer 2.0 就被标记为 deprecated,现在执行会输出警告,CI 日志里飘着烦,新项目没必要碰。
composer run 和直接 composer [script-name] 哪个该用
优先用 composer run 或更简洁的 composer [script-name]。比如 composer test 和 composer run test 效果一样,但前者少打字、无警告、支持所有新参数(如 --list)。
- 脚本名是纯字母数字+短横线(如
cs-fix),直接composer cs-fix最省事 - 脚本名含冒号(如
ci:lint)或点号时,composer ci:lint会报错,必须用composer run "ci:lint"(引号不能少,Windows 下尤其关键) -
composer run-script不支持--list,查可用脚本只能靠composer run --list - 想绕过 pre-/post- 钩子?
composer run --no-hooks test可行;composer run-script要加--no-hooks,但命令本身已弃用,不值得折腾
传参总失败?记住那个双横线 --
想把 --filter=MyTest 传给 PHPUnit,漏掉 -- 就全白搭:前者会被 Composer 当作自身参数吃掉,后者才透传给脚本进程。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 错误写法:
composer test --filter=MyTest→ 可能静默忽略或报错 - 正确写法:
composer test -- --filter=MyTest→ 第一个--是分隔符 - PHP 脚本里用
$argv接收时,$argv[0]是脚本路径,你传的参数从$argv[1]开始;建议开头加array_shift($argv) - Shell 脚本里用
"$@",但得用引号包裹,比如"deploy": "bash deploy.sh \"$@\""
脚本执行报 Class not found 或找不到命令
Composer 执行脚本时不会自动引入 vendor/autoload.php,PATH 也只前置了 vendor/bin/,不是当前 shell 环境。
- PHP 脚本第一行必须显式引入:
require __DIR__ . '/vendor/autoload.php'; - 调用本地二进制(如
php-cs-fixer)推荐写成vendor/bin/php-cs-fixer,避免依赖 PATH 或全局安装 - 调试环境:临时加个
"debug": "pwd && echo $PATH && which php-cs-fixer",再跑composer debug看输出 - 脚本里执行
git、npm等命令前,先用which git或command -v npm检查是否存在,别假设它们一定在 PATH 里
最常被忽略的一点:脚本名必须和 composer.json 中 scripts 字段下的键名**完全一致**——大小写、短横线、冒号、引号,一个都不能错;composer run --list 是唯一可靠验证方式,别靠记忆或编辑器高亮猜。










