composer depends 命令在 composer 2.4+ 中存在但默认关闭,2.3 及更早版本中不存在;推荐使用稳定命令 composer why 查询反向依赖,正向查依赖链应升级至 2.5+ 使用 composer tree。

composer depends 命令到底存不存在?
它在 Composer 2.4+ 中存在,但默认关闭;在 2.3 及更早版本中,composer depends 命令根本不存在——执行只会报错 Command "depends" is not defined。这不是你装错了,是官方压根没开放这个功能。
- 启用方式(仅限当前项目):
composer config experimental.show-depends true - 不推荐加
--global全局启用,因为实验功能随时可能变更或移除 - 即使启用了,
depends也只查「谁在require或require-dev里写了它」,不解析自动加载、运行时require或provide替代关系
真正该用的命令是 composer why
composer why vendor/package-name 是 Composer 2.2+ 内置、稳定、语义清晰的反向依赖查询命令,它基于 composer.lock 回溯安装原因,结果可靠。
- 不加参数:显示直接依赖者,例如
laravel/framework requires monolog/monolog (^2.0) - 加
--tree:展开完整路径,看清它是怎么被“带进来”的:laravel/framework → symfony/console → psr/log → monolog/monolog - 如果返回空,先确认三件事:
composer show看包是否已安装、composer.json拼写是否正确(monolog/monolog不是monolog\monolog)、是否只是require-dev依赖而你没装开发包(可试composer install --with-all-dependencies)
查“它依赖了谁”别用 depends,要用 composer show --tree 或 composer tree
depends 是反向查(谁用了它),show --tree 才是正向查(它用了谁)。但注意:composer show -t 在 Composer 2.0+ 已被移除,现在会报错 Unrecognized option: --tree。
- Composer ≥2.5:用
composer tree(内置命令),支持--depth=1、--no-dev、--format=json - Composer 2.0–2.4:只能用
composer show vendor/package-name查基本信息,或配合grep手动翻vendor/*/composer.json - 想快速看某包的上游依赖链?
composer show --tree monolog/monolog是错的——--tree不是show的合法选项;正确做法是升级到 2.5+ 后用composer tree monolog/monolog
查不到?别急着怀疑命令,先看依赖是否“真存在”
很多“查不到”不是命令问题,而是包根本没进你的依赖图谱——比如它被 replace 或 provide 替代了(如 psr/log 被 symfony/polyfill-psr-log 提供),或者只存在于某个 path 类型仓库里,没有远程元数据。
- 检查实际安装来源:
cat vendor/composer/installed.json | grep -A5 "monolog/monolog",看replaced或provides字段 - 确认是否为开发依赖引入:
composer depends --dev monolog/monolog(需启用实验功能) - 全局范围谁用了它?
composer depends不管用——得去 Packagist 的 “Dependents” 页面 查公开的 “Used by” 列表
composer.lock 和静态声明——运行时 require、注释里的包名、甚至 IDE 自动补全出来的依赖,它统统看不见。










