composer run-script 必须指定脚本名,需与 composer.json 中 scripts 键完全一致(区分大小写),传参需用 -- 分隔,失败时默认只返回错误码1,应加 -v 查看详细日志。

composer run-script 命令怎么写才不报错
直接运行 composer run-script 会提示 “Not enough arguments”,因为这个命令必须带脚本名。它不是交互式命令,也不接受空参数。
常见错误现象:Command "run-script" requires a script name. 或执行后什么都没发生(脚本名拼错、没定义、大小写不匹配)。
- 脚本名必须和
composer.json中"scripts"对象下的键完全一致(区分大小写) - 不能加
php、sh等前缀——Composer 自动判断执行方式 - 如果脚本名含短横线(如
post-install-cmd),要原样输入,别改成下划线
scripts 里定义的命令为什么有时不生效
Composer 不会自动加载或校验 scripts 配置是否合法,写错也不会报错,只在运行时静默失败或抛出异常。
典型场景:想用 composer run-script test 执行 PHPUnit,但实际跑的是 phpunit 命令,结果提示 Command "phpunit" is not defined。
- 确保
phpunit已安装在项目本地(vendor/bin/phpunit),或全局可用且版本兼容 - 推荐写成
"test": "vendor/bin/phpunit",避免依赖 PATH 或全局命令 - 若脚本值是数组(如
["@clear-cache", "phpunit"]),注意 Composer 7+ 才支持多命令链式执行
如何传参给 run-script 脚本
composer run-script 默认不透传参数,想把 --filter=MyTest 传进 PHPUnit,得加 -- 分隔符。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
否则参数会被 Composer 当作自身选项处理,比如 --no-interaction 或被忽略。
- 正确写法:
composer run-script test -- --filter=MyTest - 错误写法:
composer run-script test --filter=MyTest(参数被 Composer 拦截) - 如果脚本本身是 PHP 文件(如
"build": "php build.php"),参数也会原样传给build.php的$argv
run-script 和 composer 原生命令的区别在哪
composer run-script 是通用执行入口,而像 composer install 这类命令自带生命周期钩子(如 pre-install-cmd),它们本质也是通过 run-script 触发的,但用户不可见。
性能上没差异,但兼容性要注意:自定义脚本不会触发 Composer 内部事件监听器,比如你写了 "post-update-cmd",但手动 run-script post-update-cmd 不会触发其他监听该事件的插件。
- 想模拟完整生命周期?别用
run-script,改用对应原生命令(如composer update) - CI/CD 中频繁用
run-script,建议脚本名保持语义清晰(如cs-check、static-analyze),避免和 Composer 内置钩子名冲突 - Windows 下注意路径分隔符:用
vendor\bin\phpunit或正斜杠vendor/bin/phpunit(Composer 支持)
最常被忽略的一点:脚本执行失败时,Composer 默认退出码是 1,但不会打印具体错误——要看终端最后一行输出,或者加 -v 参数看详细日志。别只盯着 “Script xxx handling the xxx event returned with error code 1” 就停了。










