运行 composer run-script --list 仅当项目根目录存在含 "scripts" 键(即使为空对象)的 composer.json 时才显示脚本;若无该键、路径错误、使用全局 Composer 或脚本名含非法字符,则静默不输出;事件钩子如 post-install-cmd 会列出,但仅纯字母数字下划线命名的才是可手动执行脚本。

直接运行 composer run-script --list 就能列出所有已定义的脚本,但前提是项目根目录下存在 composer.json 且其中包含 "scripts" 字段。
为什么 composer run-script --list 有时不显示任何内容
常见原因不是命令错了,而是脚本没定义或路径不对:
-
composer.json文件里压根没有"scripts"这个键(哪怕值是空对象{},也得存在) - 当前工作目录不是项目根目录,
composer找不到正确的composer.json - 用了
composer global或其他作用域,但--list只读取当前项目的配置 - 脚本名含非法字符(如空格、斜杠),Composer 会跳过解析,也不报错,只是不显示
如何确认脚本是否真的被识别
别只信 --list 的输出,直接查 composer.json 更可靠:
{
"scripts": {
"dev": "php -S localhost:8000 -t public",
"test": [
"@php vendor/bin/phpunit",
"@phpstan"
],
"post-install-cmd": "chmod +x bin/*"
}
}
注意:post-install-cmd 这类事件钩子也会出现在 --list 结果里,但它们不是手动触发的「命名脚本」;只有键名是纯字母/数字/下划线的才会被列为可执行脚本(比如 dev、test)。
composer run-script 的实际调用细节
运行脚本时,Composer 会自动注入一些环境变量,并支持前置/后置钩子:
- 脚本内可用
$COMPOSER_BIN_DIR获取vendor/bin路径 - 加
--no-dev会导致dev类脚本里的vendor/bin/xxx命令找不到(因为未安装 dev 依赖) - 用
@php前缀可强制使用 Composer 内置 PHP 解释器路径,避免系统 PHP 版本不一致问题 - 如果脚本数组里某条命令失败(非零退出码),默认会中断后续命令 —— 加
--no-interaction不影响这个行为,得靠|| true显式忽略
真正容易被忽略的是:脚本列表不反映执行顺序,也不体现依赖关系;"test" 里写了两行命令,--list 仍只显示一行 test。想看完整执行链,得打开 composer.json 自己数。










