composer depends 用于反向查找谁依赖某包,仅输出扁平列表;composer tree(2.5+内置)才支持树形依赖展示,替代已移除的 composer show -t。

composer depends 查看谁依赖了某个包
当你想定位某个包(比如 monolog/monolog)为什么被装进项目里,composer depends 是最直接的命令。它反向查依赖关系,告诉你哪些包(包括 root 项目)显式或隐式依赖了目标包。
常见错误是误用成 composer depends --tree——这个参数不存在,depends 不支持树形输出,只返回扁平列表。
- 基础用法:
composer depends monolog/monolog,列出所有直接依赖它的包 - 加
-t(--tree)会报错,别试 - 加
-r(--recursive)可递归查二级依赖者,但结果仍是线性,不是缩进树 - 如果返回空,说明该包是通过
replace或provide被间接满足的,此时需结合composer show看实际安装版本来源
composer tree 查看当前项目的完整依赖树
composer tree 是查看正向依赖结构的核心命令,但它不是 Composer 内置命令——它是 composer/composer 官方插件 phpstan/phpstan 或更常见的 hirak/prestissimo 都不提供;真正可用的是社区插件 miloschuman/composer-tree,但已废弃;目前最稳定的是官方在 Composer 2.5+ 内置的 composer tree(注意:仅限 2.5.0 及以上)。
如果你执行 composer tree 报 “Command 'tree' is not defined”,大概率是 Composer 版本太低。
- 确认版本:
composer --version,必须 ≥ 2.5.0 - 基础用法:
composer tree,默认显示全部依赖,带缩进和版本号 - 只看直接依赖:
composer tree --no-dev --depth=1 - 过滤特定包:
composer tree | grep "guzzlehttp"(Linux/macOS),Windows 可用findstr - 注意:--dev 依赖默认包含,用
--no-dev排除,否则树会非常宽
composer show -t 的替代方案与兼容性陷阱
早年很多人用 composer show -t 查依赖树,但该选项在 Composer 2.0 中已被移除,现在执行会报错 Unrecognized option: --tree。这不是拼写错误,是功能下线。
如果你维护旧文档或 CI 脚本,遇到这个报错,不要试图降级 Composer,而应升级命令逻辑。
- Composer 2.0–2.4:没有原生命令替代
show -t,只能靠composer depends+ 手动追溯,或临时装插件phpstan/extension-installer(不推荐) - Composer 2.5+:用
composer tree,它比旧show -t更清晰,支持--format=json便于脚本解析 - CI 场景建议:在
composer.json中锁定"composer/composer": "^2.5"或检查COMPOSER_VERSION环境变量再决定命令路径
依赖冲突时 tree 输出的误导性信号
composer tree 显示的是“已安装”的结构,不是“解析后应有”的结构。当存在未解决的依赖冲突(比如两个包要求不同主版本的 symfony/console),composer install 会失败,但 composer tree 仍可能输出一个看似合理的树——因为它读的是 vendor/composer/installed.json,而这个文件可能残留上一次成功安装的状态。
- 判断是否可信:先运行
composer validate和composer check-platform-reqs - 强制刷新状态:
rm -rf vendor && composer clear-cache && composer install,再跑tree - 关键提示:tree 不校验约束,只展示快照;真正可靠的依赖分析要结合
composer why-not和composer prohibits
path 仓库、platform 配置或 conflict 规则时,tree 和 depends 的输出都可能跳过中间抽象层——这时候得打开 vendor/composer/installed.json 自己扒字段。










