composer run-script --list没输出是因为composer.json中缺失或拼写错误scripts字段(如script、scripts、"scripts "),该命令仅识别顶层严格匹配的"scripts"对象,即使为空{}也能触发输出;常见原因还包括在子目录执行、json含bom或语法错误、脚本名含非法字符、误用global模式。

composer run-script --list 为什么没输出?
不是命令错了,是 composer.json 里压根没定义 scripts 字段,或者拼写错误(比如写成 script、Scripts、"scripts ": 多了个空格)。Composer 只认顶层、大小写严格匹配的 "scripts" 键,哪怕值是空对象 {},也能触发列表输出。
常见静默失败场景:
- 在子目录下执行命令,找不到项目根目录的
composer.json -
composer.json被 IDE 自动加了 BOM 或删了末尾逗号,JSON 解析失败(加--verbose可看到警告) - 脚本名含空格或未转义引号(如
"test all"),Composer 直接跳过,不报错也不显示 - 用了
composer global run-script --list,它只读当前项目配置,global 没用
如何确认 scripts 字段是否合法?
别依赖 composer run-script --list 的输出来判断脚本是否存在——它只负责“展示”,不负责“校验”。最可靠的方式是直接打开 composer.json 查看:
必须满足这三点:
-
"scripts"是顶层字段,且值为 JSON 对象({}或含键值对) - 键名只能是字母、数字、下划线、冒号、中划线(如
test:unit、phpcs:fix),不能有空格 - 值可以是字符串或字符串数组;若为数组,
--list只显示第一个元素,不展开
例如这个配置是合法的:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"scripts": {
"dev": "php -S localhost:8000 -t public",
"test": ["@php vendor/bin/phpunit", "@phpstan"],
"post-install-cmd": "chmod +x bin/*"
}
}
composer run-script --list 和 composer show --events 有什么区别?
composer run-script --list 只显示你明确定义在 scripts 里的条目(包括生命周期钩子如 post-install-cmd),但前提是它们被显式写进去了;而 composer show --events 列出的是 Composer 所有内置事件名(如 pre-autoload-dump、post-update-cmd),不管你的 composer.json 有没有绑定。
关键差异:
-
run-script --list:告诉你“哪些脚本能手动跑”,输出两列纯文本,左脚本名、右命令,无颜色无分页 -
show --events:告诉你“哪些事件能监听”,输出按阶段分组,不需要composer.json,甚至不在项目目录也能运行 - 两者互补:想查自己写了啥,用前者;想查还能监听啥,用后者
脚本带描述或分类信息怎么实现?
composer run-script --list 原生不支持描述字段。所谓 scripts-descriptions 只影响 composer list 输出,对 run-script --list 完全无效。
真正可用的办法只有两个:
- 在脚本命令开头加
echo提示,比如"test": "echo '▶ Running unit tests'; php vendor/bin/phpunit",但这只是运行时打印,不参与元数据管理 - 把用途、依赖、执行顺序等写进
README.md,靠团队约定维护——Composer 不管文档化这事
注意:如果你定义了和内置命令同名的脚本(比如 "install"),composer install 默认仍走原生逻辑,除非加 --no-plugins;这点容易误判,调试时得留神。










