composer show 默认不支持直接导出,需用 --format=json 重定向保存为结构化数据,或用 grep 过滤后保存为文本;--tree 输出含 ansi 码需加 --no-ansi 才可重定向;-d 仅列直接依赖且按包名排序,无法体现完整依赖链;查 root 包需指定完整 name;show 输出的是安装版本而非 composer.json 中的约束版本,复现依赖应以 composer.lock 为准。

composer show 列出所有已安装包但太杂乱,怎么快速导出为文本
默认 composer show 只在终端滚动输出,没法直接保存或筛选。它本质是调试用命令,不是导出工具。
真正能导出的其实是加 --format=json 或重定向到文件:
-
composer show --format=json > deps.json—— 得到结构化数据,适合后续解析 -
composer show | grep "/" > deps.txt—— 简单过滤出包名行(因包名含/,如monolog/monolog) - 别用
composer show --tree导出:树形输出含 ANSI 颜色码,重定向后变成乱码,需加--no-ansi
composer show -D 显示依赖关系但层级错乱,怎么看清谁依赖谁
composer show -D 会列出每个包的直接依赖,但顺序按包名排,不是按依赖链组织。想理清 A → B → C 这种链路,得手动追踪。
更实用的做法是分两步:
- 先用
composer show --tree查某个具体包的依赖树:composer show --tree monolog/monolog - 若要全局分析,
composer show --format=json输出后,用脚本提取require字段(注意:JSON 中字段名是require,不是requires) - 警惕
require-dev:它不会出现在show -D结果里,但会出现在完整 JSON 中,容易漏掉测试依赖
composer show 报错 “Package not found”,但包明明装好了
常见原因是拼写错误或作用域混淆。Composer 区分 root package 和 vendor packages,composer show 默认只查 vendor 下的包。
- 查自己项目(root):用
composer show myvendor/myproject—— 必须和composer.json里的name完全一致,包括 vendor 名 - 查未启用 autoloading 的本地路径包:
composer show不识别,它只认已解析进vendor/的包 - 查被替换(replace)或禁止安装("provide")的包:它们不会出现在
show列表中,即使功能由其他包提供
导出结果里没有版本约束(如 ^2.0),只有安装版本(如 2.12.3),怎么还原 require 行
composer show 只反映当前 lock 文件状态,不回溯 composer.json 里的原始约束。这是设计使然,不是 bug。
要拿到原始 require 版本号,必须看源配置:
- 直接读
composer.json的require和require-dev字段 - 用
composer show --format=json得到的是 lock 后的实际版本,和composer.lock里packages数组一致 - 如果项目没提交
composer.lock,show输出的版本可能和别人环境不一致 —— 这就是为什么导出列表不能代替 lock 文件做部署校验
真正需要可复现的依赖快照,别依赖 show,老实用 composer.lock 或 composer install --dry-run 验证。










