composer depends命令在绝大多数Composer安装中根本不存在;真要查“谁用了这个包”,应使用稳定可靠的composer why或composer show --who命令。

composer depends 命令在绝大多数 Composer 安装中根本不存在——不是你漏装了,是它压根没开放;真要查“谁用了这个包”,该用 composer why 或 composer show --who。
为什么 composer depends 总报错 “Command not defined”
这个错误非常正常:Composer 2.3 及更早版本里确实没有 depends 命令;2.4+ 虽然引入了它,但属于实验功能,默认关闭。你执行 composer depends monolog/monolog 报错,不是配置问题,是官方没给你开这个门。
想临时启用(仅当前项目):
- 运行
composer config experimental.show-depends true - 不推荐加
--global,因为实验功能随时可能被移除或行为变更 - 启用后仍只扫描
require和require-dev字段,不解析provide、replace或运行时加载
composer why 才是你该记住的稳定命令
composer why 是 Composer 2.2+ 内置、基于 composer.lock 的反向依赖查询,结果可靠、语义清晰。
- 不加参数:
composer why psr/log显示直接依赖者,例如symfony/console requires psr/log (^1.0) - 加
--tree:composer why --tree psr/log展开完整路径:myapp/myproject → laravel/framework → symfony/console → psr/log - 如果返回空,先确认三件事:
composer show看包是否已安装、composer.json拼写是否为psr/log(不是psr\log)、是否只是require-dev依赖而你没装开发包(可试composer install --with-all-dependencies)
composer show -t 查正向依赖树(谁被谁依赖)
composer show -t 是当前最稳、无需额外配置的正向依赖树命令,--tree 别名早在 2.0+ 就被弃用,现在必须用短参数 -t。
-
composer show -t .:查看整个项目的完整依赖树(点号代表当前项目) -
composer show -t guzzlehttp/guzzle:只展开该包及其下游依赖 -
composer show --no-dev -t .:注意--no-dev必须放在-t前面,否则无效 - 输出中带
[7.8.1]的括号内容是你实际安装的版本,不是composer.json里写的约束;如果看到v6.5.8但写了"^7.0",说明有其他包强制降级了它
容易被忽略的边界情况
很多“查不到”不是命令失效,而是依赖关系本身不在 Composer 静态图谱里:
- 包被
replace或provide替代(如psr/log被symfony/polyfill-psr-log提供),why和depends都不会显示原始引用者 - 依赖来自
path类型仓库,没有远程元数据,composer.lock可能不完整 - 手动复制进
vendor/或通过脚本动态加载,完全绕过 Composer 解析 - 缓存未更新:改完
composer.json没跑composer update --lock,composer.lock就是旧的
真正麻烦的不是命令怎么写,而是误以为它们能覆盖所有依赖来源——它们只看 Composer 解析出的静态声明,不碰运行时逻辑。


















