直接运行composer show只显示composer.json中直接声明的顶层依赖,不包含间接依赖;查完整依赖树必须用composer show --tree,它按缩进层级展示vendor/中所有实际安装包及其依赖路径。

直接运行 composer show 就能列出当前项目中真实安装在 vendor/ 下的包,但它默认只显示顶层依赖(即 composer.json 中 require 和 require-dev 里直接声明的包),不包含任何子依赖——这不是 bug,是设计行为。
为什么 composer show 输出比 ls vendor/ 少很多
它读的是 composer.lock 里的 packages 字段,跳过所有间接依赖。比如你没手动 require psr/log,但 laravel/framework 拉了它进来,composer show 默认就不列它。
- 确认是否真装上了:用
composer show vendor/name查单个包,返回版本号才说明已安装 - 包名必须写全且大小写敏感:
guzzlehttp/guzzle≠GuzzleHttp/Guzzle - 如果输出为空或报
No composer.json found,先cd到含composer.json和vendor/的项目根目录 - 刚改过
composer.json但没运行composer install?那show不会显示新包
查完整依赖树:必须用 --tree,不是可选项
composer show --tree 是唯一能还原 Composer 实际解析出的安装路径的方式。它递归展开每一层依赖,缩进表示层级,例如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
laravel/framework v10.48.12
└── symfony/console v6.4.7
└── psr/log 3.0.0
- 它只展示
composer.lock里已确定的路径;若某包只在require-dev且你用过--no-dev,就不会出现 - 终端宽度不够导致包名被截断?加
| less -S或重定向到文件:composer show --tree > deps.tree - 想快速定位某个依赖,用管道过滤:
composer show --tree | grep guzzle,注意保留前导空格才能看出层级 -
--tree不支持通配符:composer show --tree "laravel/*"会报错
查 autoload 映射和 scripts 配置:加 -s 才能看到关键字段
类找不到、自定义命令不执行,八成是 autoload 映射或 scripts 没配对。composer show -s vendor/name 会直接把这两块打出来,不用翻源码或 composer.json。
-
composer show -s monolog/monolog会显示"Monolog\": "src/",说明Monolog\Logger对应vendor/monolog/monolog/src/Logger.php - 也会列出
scripts字段注册的钩子,比如post-install-cmd是否包含phpunit - 这个选项在 Composer 2.2+ 才稳定支持;旧版本会报
unrecognized option,别硬试 - 不加
-s时,默认只输出一行:monolog/monolog 3.5.0,容易误判为“查不到详情”
最常被忽略的一点:composer show 始终读取 vendor/ 下的实际安装状态,不是 composer.json 的声明,也不是 composer.lock 的快照——三者不一致时,以 show 输出为准,因为它是磁盘上真实存在的证据。










