执行 composer run-script --list 无输出,是因为 composer.json 中缺少或拼写错误 scripts 字段(如误为 script),该命令仅识别顶层 scripts 对象,忽略 scripts-descriptions 等其他字段。

执行 composer run-script --list 为什么没输出?
多数情况下,运行该命令后终端一片空白,不是脚本不存在,而是 Composer 默认只显示 "scripts" 中顶层定义的脚本(即不嵌套在 "scripts-descriptions" 或其他自定义键下的内容),且要求 composer.json 中必须存在 "scripts" 字段——哪怕它是空对象也会触发列表输出。如果字段缺失或拼写错误(如写成 "script"),命令就静默退出。
- 确认
composer.json包含"scripts": {}或至少一个键值对,例如:"scripts": { "dev": "php -S localhost:8000 -t public" } - 不要依赖
"scripts-descriptions":这个字段仅用于composer list显示说明,run-script --list完全忽略它 - 注意权限和路径:确保在项目根目录下执行,且当前用户对
composer.json有读取权限
composer run-script --list 输出的格式与含义
当命令正常工作时,输出是纯文本两列:左侧为脚本名(key),右侧为对应命令(value),中间用两个空格分隔。它不会显示别名、钩子(如 pre-autoload-dump)或事件监听脚本,只列出显式定义在 "scripts" 下的条目。
- 脚本名支持中划线(
test:unit)、冒号分隔(phpcs:fix),但不能含空格或未转义的引号 - 若 value 是数组(多条命令),
--list只显示第一个元素(Composer v2.5+ 开始支持数组脚本,但--list仍不展开) - 输出不含颜色或样式,无法通过参数开启高亮
替代方案:快速查看所有可运行脚本(含事件钩子)
想看到更完整的脚本视图(包括 post-install-cmd 这类生命周期事件),composer run-script --list 不够用。直接读取 JSON 更可靠:
- 用
jq查看全部:jq '.scripts' composer.json
- 过滤出非空脚本(排除注释或空字符串):
jq 'with_entries(select(.value != null and .value != ""))' composer.json
- 人工检查常见钩子:打开
composer.json,搜索"pre-"、"post-"、"auto-"等前缀,它们虽不列在--list中,却会在对应事件触发时自动执行
为什么有些脚本在 --list 里出现,但 composer run-script xxx 报错?
列表只是“声明存在”,不代表能立即执行。常见断裂点:
- 命令本身不存在:比如写了
"cs": "phpcs",但系统未安装phpcsCLI,或不在$PATH中 - 路径上下文错误:脚本中用了相对路径(如
"test": "php tests/run.php"),但执行时工作目录不是项目根,导致文件找不到 -
环境变量缺失:某些脚本依赖
$_ENV['APP_ENV']或.env文件,而run-script默认不加载它们(除非脚本自己调用dotenv) - PHP 版本不兼容:脚本调用的函数在当前 PHP 版本中被弃用或移除(如
create_function())
真正要验证脚本是否可用,得单独运行一次并观察 stderr 输出,而不是只信 --list 的存在性。










