composer run-script --list仅列出composer.json顶层scripts字段中显式定义的脚本名与命令,要求该字段存在、拼写正确(如不能是script或scripts)、语法合法且为json对象,否则静默无输出;它不显示描述、不展开数组值、不识别scripts-descriptions,也不枚举内置事件——查事件应使用composer show --events。

composer run-script --list 不是万能的脚本查看器,它只认 composer.json 顶层的 scripts 字段,且该字段必须存在、拼写正确、语法合法——缺一不可,否则静默退出,不是没脚本,是压根没读到配置。
为什么执行后终端一片空白?
最常见原因不是脚本没写,而是 composer.json 根本没定义 scripts 键,或写成了 script(少个 s)、"scripts ":(键名带空格)、Scripts(大小写错)。
-
scripts必须是顶层 JSON 对象,不能缩进在require或其他块里 - 哪怕写成
"scripts": {}(空对象),也能触发正常输出 - 某些编辑器保存时自动删掉末尾逗号或加 BOM,导致 JSON 解析失败;加
--verbose可看到解析警告 - 不在项目根目录执行,
composer找不到composer.json,也不会报错,只是不输出
输出内容到底包含哪些脚本?
输出是纯文本两列:脚本名(左)和对应命令(右),中间用两个空格分隔。它不显示颜色、不分页、不展开数组值,也不管你写了多长的描述。
- 只列出
scripts对象下显式定义的键,比如"test:unit"、"phpcs:fix" - 生命周期钩子如
post-install-cmd会出现在列表里,但它们不是你手动触发的“命名脚本”,而是 Composer 自动调用的事件 -
scripts-descriptions字段完全被忽略,它只影响composer list输出 - 若命令值是数组(如
"test": ["@php vendor/bin/phpunit", "@phpstan"]),--list只显示第一个元素
想看更全的可用事件名,该用什么命令?
composer run-script --list 不负责枚举所有可监听的 Composer 事件,它只展示你“绑定了什么”。要查完整内置事件清单,得换命令:
- 运行
composer show --events,它列出全部生命周期事件,包括pre-autoload-dump、post-package-install等 - 这个命令不依赖当前目录是否有
composer.json,也不要求scripts字段存在 -
composer show --events和composer run --list是互补关系,不是替代关系 - 想确认某个事件是否已被绑定,还得回
composer.json里搜键名,别指望靠命令自动推导
现在该用哪个命令代替 run-script?
composer run-script 从 Composer 2.0 起已被标记为 deprecated,仅保留兼容性,CI 日志里会飘警告,新项目不该再用。
- 优先用
composer run --list替代composer run-script --list - 执行脚本时,直接
composer run test或composer test(后者仅限不含冒号/连字符的脚本名) - 脚本名含冒号(如
ci:lint)或连字符时,必须加引号:composer run "ci:lint",Windows 下双引号不能省 -
composer run和composer run-script行为一致,但前者不会报警告,也更符合当前文档惯例
真正容易被忽略的是:脚本列表不体现执行顺序、不反映依赖关系、也不校验命令是否存在——它只是把 composer.json 里 scripts 的键名原样吐出来。想确认一个脚本能跑通,唯一可靠方式是真去执行一次,或者打开 composer.json 自己核对路径和命令拼写。











