直接运行 composer show 仅列出所有已安装包的名称和版本,不显示依赖树或详细信息;加 -t(--tree)才展开完整依赖树,含嵌套层级与冲突提示,且版本号以 versions : * x.y.z 格式显示。

直接运行 composer show 就能看到所有已安装包及其精确版本号,包括依赖树里间接引入的包——但默认输出不带版本号,得加参数。
只看顶层依赖(你手动 require 的那些)
运行 composer show --direct,它过滤掉所有传递依赖,只列出 composer.json 里 require 和 require-dev 显式声明的包。注意:即使某个包被多次 require(比如不同子包都依赖 psr/log),这里也只出现一次。
- 适合快速核对是否装了预期的主库,比如确认
laravel/framework是不是v10.48.12 - 不显示该包自身依赖了谁,想查依赖链得去掉
--direct - 如果某包在
require-dev里但没安装(比如phpunit/phpunit被autoload-dev排除),它也不会出现在结果中
查某个具体包的详细信息和依赖关系
用 composer show vendor/package-name,比如 composer show monolog/monolog。它会显示该包的当前安装版本、描述、homepage、源码地址,以及它直接依赖了哪些其他包(即它的 require 列表)。
- 版本号写在第二行,格式是
versions : * 3.5.0这种,*表示当前锁定版本 - 如果该包没安装(比如被
replace或conflict排除),命令会报错:Package monolog/monolog not found - 它不递归展开依赖的依赖,比如
monolog/monolog依赖psr/log,但不会自动显示psr/log依赖了谁
显示完整依赖树(含嵌套层级和版本冲突提示)
执行 composer show -t,它会以缩进树形结构展示所有已安装包,并标出每个包的实际安装版本。如果某个包被多个父包依赖且版本要求不一致,Composer 会尝试统一版本;若无法满足,会在对应位置标出 (conflict) 并终止输出。
- 缩进越深,表示依赖层级越深,比如顶行是你的项目,下一级是你
require的包,再下一级是它们的依赖 - 同一包可能在不同层级重复出现(如
symfony/polyfill-php81被symfony/console和guzzlehttp/guzzle同时依赖),但只会安装一个版本 - 如果看到某行末尾有
(dev-main)或(dev-develop),说明这个包是从 VCS 源拉的开发分支,不是稳定版 tag
为什么 composer show 不显示本地路径或软链接包?
当使用 path 类型仓库(如 "my/local-package": "*" @dev 配合 "repositories": [{"type": "path", "url": "../local-package"}])时,composer show 默认只显示包名和版本(通常是 dev-main),不显示真实路径。要确认是否走的是本地路径,得看 composer.lock 里对应包的 source 字段,或者运行 composer show -v vendor/package 查看详细元数据。
-
-v(verbose)会打印source.type和source.url,如果是path类型,url就是本地绝对路径 - 如果包是通过
satis或私有 Packagist 镜像安装的,source.url会是 HTTP 地址,而非git@或https://的源码地址 - 别依赖
composer show判断包是否“真正生效”——有些包仅用于autoload-dev,生产环境根本不会加载,但它依然会出现在show结果里
真正容易被忽略的是:Composer 的版本号显示基于 composer.lock,不是 vendor/ 目录里的实际文件内容。如果你手动删过某个包又没 run update,show 仍会按 lock 文件显示“已安装”,但实际文件可能缺失。


















