composer show 是查包信息的唯一可靠入口,读取 vendor/ 和 composer.lock 的实际状态,不显示子依赖;加 -s 查 autoload/scripts,--tree 查依赖树,--all 查远程所有版本,必须写全包名且在项目根目录执行。

composer show 是查包信息的唯一可靠入口,不是“能用就行”的辅助命令,而是诊断 autoload、依赖冲突、版本兼容性的第一现场。
查当前项目装了哪些包:直接 composer show,但别指望它显示全貌
它读的是 vendor/ 目录下的真实安装状态,不是 composer.json 里写的声明。输出只有三列:name、version、description,一行一个包。
- 不加参数时,只列出顶层依赖(即
composer.json中require和require-dev里直接写的包),不会展开子依赖 - 如果用了
composer install --no-dev,require-dev里的包就不会出现在列表中 - 输出太长?别手动翻页,用管道:
composer show | less或composer show | grep -i "cache" - 不支持模糊搜索:
composer show log匹配不到monolog/monolog,必须写全名或至少前缀,如composer show monolog
查某个包为什么类找不到:加 -s 看 autoload 和 scripts 配置
类加载失败、自定义命令不执行,八成是 autoload 映射或 scripts 没配对。-s(即 --show-config)直接把这两块关键字段打出来,不用去翻源码或 composer.json。
-
composer show -s monolog/monolog会显示"Monolog\": "src/",说明MonologLogger对应vendor/monolog/monolog/src/Logger.php - 也会列出
scripts字段注册的钩子,比如post-install-cmd是否包含phpunit - 这个选项在 Composer 2.2+ 才稳定支持;旧版本会报
unrecognized option,别硬试 - 不加
-s时,默认只输出一行:monolog/monolog 3.5.0,容易误判为“查不到详情”
查依赖树和版本冲突:必须用 --tree,不是可选操作
--tree 不是展示你写了什么,而是还原 Composer 实际解析出的安装路径——这才是排查 “为什么 psr/log 装了 v2 和 v3” 的唯一可靠方式。
- 输出是缩进树,例如:
laravel/framework v10.48.12 └── symfony/console v6.4.7 └── psr/log 3.0.0 - 它只展示
composer.lock里已确定的路径;如果某包只在require-dev且你用过--no-dev,就不会出现 - 想快速定位某依赖,直接管道过滤:
composer show --tree | grep guzzle,注意保留前导空格,否则缩进结构丢失 -
--tree不支持通配符:composer show --tree "laravel/*"会报错
查远程最新版或未安装包:用 --all,别再输 -a
--all 绕过本地缓存,直连 Packagist API,返回该包所有可用版本的摘要。它不是“看看而已”,而是判断能否升级、是否被弃用的关键依据。
- 必须用双横线:
--all,-a是旧版别名,在 Composer 2.2+ 中已被弃用,加了也无效 -
composer show --all guzzlehttp/guzzle会返回dev-main、v7.9.0、3.0.x-dev等全部版本,含发布时间和稳定性标记 - 某些包标记为
abandoned,--all会在输出末尾明确写出替代包名,比如symfony/http-foundation替代旧用法 - 私有包要查到,得先确认
repositories已配置,或显式加--repository https://your-satis.example.com/packages.json;填错 URL 会报Could not parse version constraint这类误导性错误
真正难的不是记住参数,而是理解每个输出背后对应的真实状态:composer show 默认行为反映的是 vendor/ 和 composer.lock 的快照,不是你的意图、不是文档、也不是 Packagist 上的“理想版本”。一旦混淆这三层,排查就会绕远路。











