直接运行 composer show 可列出当前项目所有已安装依赖及其版本号,包括直接和传递依赖,格式为 vendor/name version description;加 --direct 仅显示 composer.json 中声明的直接依赖。

直接运行 composer show 就能列出当前项目所有已安装依赖及其版本号,无需额外参数。
查看全部依赖及版本(含二级依赖)
默认执行 composer show 会递归显示所有已安装包(包括 require 和 require-dev 中声明的,以及它们间接引入的),每行格式为:vendor/name version description。注意它不区分直接依赖和传递依赖,也不显示依赖树结构。
- 想只看直接声明的依赖(即
composer.json里写的),加--direct参数:composer show --direct - 想按字母顺序排序输出,加
--sort(部分 Composer 版本支持,v2.5+ 更稳定) - 输出过长时可配合
less或head -20查看前几行:composer show | head -20
查看某个具体包的详细信息
用 composer show vendor/name 可查单个包的版本、描述、依赖关系、许可证等。例如:
composer show monolog/monolog
这会显示该包当前安装的精确版本(如 3.5.0)、它的 require 列表、源码仓库地址、是否支持 PHP 8.2 等元数据。如果包没安装,会提示 Package not found。
- 加
-s(--source)可显示包的源码路径(比如vendor/monolog/monolog/) - 加
-t(--tree)会显示该包所依赖的其他包(仅限其composer.json中声明的,非运行时实际加载的)
为什么 composer show 显示的版本和 composer.lock 不一致?
不会不一致——composer show 的版本号完全来自 composer.lock 中记录的已安装结果。如果你看到差异,常见原因有:
-
composer install或composer update没有成功执行完,vendor/和composer.lock状态不同步 - 手动修改过
vendor/下某包的代码,但没重新 dump-autoload,show仍按 lock 文件报告版本 - 使用了
composer install --no-autoloader等非常规选项,导致 autoload 未生成,但show本身不依赖 autoloader,所以不影响版本显示
替代方案:快速导出纯版本列表
如果只需要“包名 + 版本号”两列,方便比对或导入脚本,可用以下命令:
composer show --format=json | php -r "\$d = json_decode(file_get_contents('php://stdin'), true); foreach (\$d as \$pkg => \$info) echo \"\$pkg {\$info['version']}\n\";"
或者更轻量的 shell 方式(适用于 Composer v2.2+):
composer show --no-ansi | awk '{print \$1, \$2}' | grep -v '^$'
注意:这些方式跳过了 description 字段,也丢失了 dev-only 包的上下文,适合自动化场景,不适合人工排查依赖冲突。
真正容易被忽略的是:当项目启用了 platform-check 或自定义 platform 配置时,composer show 不会警告你某些包的版本其实在当前 PHP/扩展环境下无法运行——它只告诉你“装了什么”,不判断“能不能用”。得靠 composer check-platform-reqs 单独验证。










