composer list 展示的是当前 Composer 运行时实际加载并注册的命令集合,仅含已激活插件、版本兼容且未被缓存屏蔽的命令,不包含未执行 install/update 的插件命令、全局插件(除非本地也安装)、scripts 或 vendor/bin 工具。

composer list 展示的是当前 Composer 运行时**实际加载并注册的命令集合**,不是“所有可能存在的命令”,也不是项目 scripts 或 vendor/bin 下工具的列表——它只反映插件已激活、版本兼容、且未被缓存屏蔽的那部分可执行命令。
为什么有些命令在 list 里根本看不到
常见错误现象:刚 composer require phpstan/extension-installer 完,composer list 仍不显示 phpstan:analyse;或 CI 环境中 composer list 没有 normalize。
- 插件没真正激活:必须执行过
composer install或composer update,让插件的PluginInterface::activate()被调用,否则命令不会注册 - 插件未声明为
composer-plugin类型,或composer.json中缺少"extra": {"class": "..."}配置,导致 Composer 忽略其命令注册逻辑 - Composer 缓存干扰:Composer 2.2+ 默认启用命令缓存,改完插件代码后需加
--no-cache强制重载,否则list仍返回旧快照 - 作用域错位:全局安装的插件(如
composer global require laravel/installer)不会出现在项目内composer list输出中,除非该插件同时被本地require过
如何确认某个命令是否真的可用
别信 list 的存在性,更别靠 Tab 补全猜——list 只是“注册表快照”,不代表能跑通。最稳验证方式是直接问 --help:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer phpstan:analyse --help→ 成功输出帮助页 = 命令存在且可执行 -
composer normalize --help→ 报错Command "normalize" is not defined= 插件未激活 / 版本不匹配 / 拼写错误(注意是连字符-,不是下划线_) - 某些命令(如
create-project)在无composer.json的目录下会报错,但--help仍可正常显示,说明命令存在,只是执行环境受限
list 的输出格式对排查和自动化很关键
composer list 默认输出带颜色、分组、自动分页,适合人眼浏览;但脚本处理或 CI 日志分析时,这些反而干扰:
-
composer list --raw→ 输出纯 TSV 格式:dump-autoload<tab>Dumps the autoloader</tab>,无 ANSI 控制符,grep / awk 友好 -
composer list --no-ansi | grep "^d"→ 稳定过滤以 d 开头的命令,避免颜色码污染管道 -
composer list config→ 按命名空间筛选,只看config相关命令(如config、diagnose),比扫全量快得多 -
composer list --format=json→ 输出结构化数据,适合集成进 IDE 插件或 DevOps 工具链,但注意 JSON 字段名是动态生成的,不同 Composer 版本略有差异
容易被忽略的性能与上下文陷阱
composer list 看似轻量,但首次运行或插件多时可能明显卡顿——这不是 bug,是 Composer 正在逐个加载插件并调用其 getCommands() 方法。更隐蔽的问题在于:
- 同一个选项名(如
--dev)在不同命令中语义不同:composer require --dev是添加到require-dev,而composer update --dev是只更新require-dev中的包 -
composer list dump-autoload不会告诉你--optimize已在新版被弃用,也不会提示它和--classmap-authoritative的协同关系,这些只能靠composer dump-autoload --help或查 CHANGELOG - 某些命令(如
show --tree)根本不会出现在list输出里,因为它是show的子选项,不是独立命令——list只列顶层命令名
真正卡住人的,往往不是命令名记不住,而是忘了插件要先 install 才注册、缓存要手动清、--raw 和 --no-ansi 这类输出控制参数长期被跳过,以及把 list 当成“文档”而非“注册快照”来依赖。

















