composer show 默认列出已安装包的名称、版本和简短描述,不显示依赖树或详细元数据;加 -s 查 autoload/scripts、--tree 查依赖路径、--all 查远程所有版本,且结果基于 vendor/ 实际安装状态而非 composer.lock。

composer show 能查到哪些包信息?
直接运行 composer show 会列出当前项目所有已安装的包及其版本号,但不包含依赖关系或详细元数据。真正有用的其实是带参数的变体——它本质是个“包元数据探针”,不是简单罗列清单。
-
composer show vendor/package:查指定包的精确版本、描述、关键词、homepage、源码地址、autoload 配置等 -
composer show --all:显示所有可用包(含未安装的),适合找替代方案或预研 -
composer show -i:只显示已安装的包(默认行为,但显式加更稳妥)
怎么用 show 查清一个包的真实依赖链?
composer show 本身不递归展开依赖树,但配合 -t(tree)选项就能看到完整依赖路径。注意:这个选项只对单个包生效,且要求该包已安装。
-
composer show -t monolog/monolog:从根项目出发,显示 monolog 被谁引入、又引入了哪些子依赖 - 如果某包是通过 dev-only 依赖安装的(比如在
require-dev中),-t仍会显示,但需确认是否影响生产环境 - 遇到
[InvalidArgumentException] Package not installed错误,说明包没装进vendor/,可能是被conflict规则排除,或只存在于 lock 文件里
show 输出里哪些字段容易被忽略但很关键?
输出中几个字段看似静态,实则直接影响自动加载和运行时行为:
-
type:值为library、metapackage或project,决定 Composer 是否尝试 autoload —— 比如type: metapackage的包通常无代码,只用于聚合依赖 -
autoload和autoload-dev:直接对应vendor/composer/autoload_*.php的生成逻辑;若字段为空,该包的类不会被自动加载 -
require列表里的版本约束(如^2.0)是实际生效的约束,不是composer.json原始写法,可用于排查版本冲突根源
为什么 show 显示的版本和 composer.lock 不一致?
这是最常被误解的一点:composer show 总是读取已安装在 vendor/ 中的包的实际内容,而 composer.lock 记录的是上次 install 或 update 时的快照。两者不一致,往往意味着你手动删过 vendor/ 但没重装,或用了 --no-install 更新 lock 文件。
- 执行
composer show package-name报错,但composer.lock里有记录 → 包没真正安装,vendor/缺失文件 - show 显示 v3.1.0,lock 文件里记的是 v3.0.5 → 你运行过
composer update package-name但没提交 lock 文件 - 想验证当前运行环境真实加载的版本?别信 lock,
composer show才是真相
实际调试时,composer show 最容易被低估的地方在于:它不触发任何安装或更新逻辑,纯读取,所以快、安全、可重复。但正因为不计算依赖,也看不到冲突预警——真要解冲突,还得回到 composer why-not 或 composer depends。











