composer show 默认只显示顶层依赖,因其仅解析 composer.lock 中的顶级 packages 字段,忽略间接依赖;需用 --tree 查完整依赖树,--direct 看直接依赖,--installed 导出已安装列表,--global 查全局包,--all 则检索源中可用包而非已安装包。

直接运行 composer show 只显示顶层依赖,不是全部已安装包
很多人执行 composer show 后发现列表很短,只看到自己在 composer.json 里写的几个包,误以为“没装全”。其实这是默认行为:它只读 composer.lock 中的顶级 packages 字段,跳过所有间接依赖(比如 monolog/monolog 被 symfony/console 拉进来,就不会出现在默认输出里)。
-
composer show不扫描vendor/目录,完全依赖composer.lock的解析结果;锁文件损坏或执行过composer install --no-install时,输出可能和磁盘实际内容不一致 - 想确认某个包是否真被装进
vendor/,最可靠的方式是ls vendor/包名或composer show 包名看是否返回版本号 - 未运行过
composer install或composer update的项目,composer show会报错或为空——它需要vendor/autoload.php或至少有效的composer.lock
composer show --tree 才能看到完整依赖树
依赖嵌套深了,靠肉眼拼接 composer show 的几行输出根本理不清谁依赖谁。--tree 是唯一能展开整个依赖图谱的选项,它递归读取 composer.lock 中的 packages-dev 和嵌套 requires,还原出真实的安装结构。
- 输出里带缩进和箭头(如
├── symfony/console v6.4.0→│ └── psr/log ^1.0),一眼看出层级和版本约束来源 - 如果某包在
require-dev里且当前用--no-dev安装过,它不会出现在--tree结果中——--tree尊重当前安装状态,不强行包含未启用的开发依赖 - 终端宽度不够时,长包名会被截断;建议加
| less -S或重定向到文件:composer show --tree > deps.tree
查特定包、导出清单、过滤全局包的实用组合
日常高频动作不是“看全量”,而是“找某个包”“导出给同事”“确认全局工具”。这些场景下,单靠 composer show 基本没法高效完成,必须搭配参数或管道。
- 查具体包信息:
composer show monolog/monolog—— 必须输全名,monolog或Monolog都会报Package not found - 导出干净列表(比如发给运维):
composer show --installed --no-ansi,去掉颜色和格式控制符,适合粘贴到文档或脚本解析 - 只看直接依赖(即你亲手写进
composer.json的):composer show --direct,比肉眼扫composer.json更准,因为会排除被replace或provide覆盖掉的包 - 查全局安装的工具:
composer global show,和项目命令完全独立,走的是~/.composer/vendor/路径
搜索未安装的包或私有包时,composer show --all 很容易误导人
--all 看起来像“查所有”,但它查的是 Packagist(或你配置的私有源)上“可用”的包列表,不是“已安装”的。它不显示版本号、不展示依赖关系、也不校验 PHP 兼容性,纯属元数据快照。
-
composer show --all | grep -i cache能列出所有含cache的包名,但无法告诉你symfony/cache的最新稳定版是不是支持 PHP 8.2 - 查私有包前,先确认
composer.json的repositories已正确声明;否则--repository https://your-satis.example.com/packages.json myorg/private-lib才能命中 -
--all结果受minimum-stability影响:设为stable时,alpha/beta 版本不会出现,哪怕它们确实存在于源中
真正要确认一个包能不能装、该装哪个版本,得用 composer search 或直接 composer require 包名 看解析结果——show 命令从不参与依赖求解过程,它只是个“快照阅读器”。










