composer show 命令仅显示 composer.lock 中直接声明的依赖包,不递归子依赖;加 --tree 才展示完整安装树;需在项目根目录执行且依赖 composer.lock 文件存在。

直接列出所有已安装包:用 composer show 就够了
在项目根目录(有 composer.json 和 composer.lock 的地方)运行 composer show,就能立刻看到当前 vendor 下所有**直接声明的依赖包**及其版本、描述——不联网、不扫描文件,只读 composer.lock,快且可靠。
- 默认只显示
require和require-dev中你手动写的包,不展开它们的子依赖 - 如果
composer.lock不存在(比如刚初始化但没 run 过composer install),命令会返回空或报错,这时composer show没意义,得先装依赖 - 别在错的目录执行:常见问题是终端当前路径不是项目根目录,结果提示
Command "show" is not defined或输出为空——先ls composer.json确认位置
想看完整依赖树?必须加 --tree
composer show 不加参数 ≠ 查看全部已安装包。它不递归;而 composer show --tree 才真正反映 vendor 目录里实际存在的所有包及其嵌套关系。
- 输出是缩进结构,例如
monolog/monolog下面跟着psr/log,再下一层可能是psr/cache(如果被引用) - 同一包被多个父包依赖时,只显示第一次出现的路径,不会重复展开——这既是简化也是陷阱,容易误判“某个包没被装”
- 输出太长?直接管道过滤:
composer show --tree | grep "guzzlehttp"或用less分页查看 - 注意:若某包因版本冲突被丢弃(没进最终解析结果),
--tree也不会显示它——它展示的是 Composer 实际安装的那一棵“活树”,不是所有可能路径
查某个包的详情或是否装了:composer show vendor/package
这是排查类加载失败、版本不一致、autoload 配置问题的第一步。指定包名后,composer show 会输出它的安装路径、源类型(git/dist)、require 列表、autoload 规则等。
- 包名大小写敏感,
symfony/console≠Symfony/Console;拼错就报错:Package not found: xxx - 如果刚
composer require xxx但中途中断或网络失败,vendor/ 里没文件、lock 里也没记录,那这个包就“不存在”,composer show xxx必然失败 - 加
-s(--source)能看到 Git URL 和 commit hash,适合验证是否用了 fork 分支或 dev 版本 - 加
--format=plain可获得纯文本两字段输出(vendor/name version),方便 CI 脚本做字符串匹配,比如检查是否用了带安全修复的doctrine/annotations v1.14.3
为什么 composer show 没反应或报错?先盯住这三个点
90% 的问题和命令本身无关,而是环境或状态异常。别急着搜“show 命令失效”,先快速过一遍:
-
pwd是否在项目根目录?ls -l composer.{json,lock}确认两个文件都存在且可读 - 是否设置了错误的
COMPOSER环境变量?临时绕过:COMPOSER= composer show - Composer 版本太老(尤其是 1.x 用户):运行
composer self-update升级;旧版可能不支持--tree或把show当作未定义命令
真正容易被忽略的是:依赖状态以 composer.lock 为准,不是 vendor/。删了 vendor 但 lock 还在?composer show 仍能工作;lock 没了?那就只剩 composer.json,而 show 对它无能为力。










