composer why 直接显示某包被谁引入,仅展示最短依赖路径;加 -a 查所有路径,需在含 composer.lock 的项目根目录执行。

composer why 看某个包为什么被安装
直接运行 composer why vendor/package-name,就能查出这个包是被谁显式 require 进来的,或者被哪个依赖间接拉进来的。它不关心你本地有没有写 require,只看当前 composer.lock 里实际解析出的依赖图。
- 如果包名拼错或没安装,会报错:
Package vendor/package-name is not required in your composer.json. - 它默认只显示**最短路径**(即离 root 最近的一条依赖链),不会列出所有可能路径
- 想看所有路径?加
-a参数:composer why -a vendor/package-name - 注意:必须在项目根目录下执行,且项目得有有效的
composer.lock(否则报错找不到 lock 文件)
composer why-not 检查为什么某个版本装不上
当 composer require vendor/package:2.0 失败时,composer why-not 能告诉你卡在哪——通常是某个已装包锁死了冲突版本。
- 用法:
composer why-not vendor/package:2.0 - 输出会指出:是
another/package要求vendor/package:^1.5,和你要的2.0冲突 - 它分析的是版本约束(constraints),不是具体已装版本,所以即使你本地没装
vendor/package,只要其他包声明了不兼容的约束,它也会报出来 - 这个命令对调试“明明有新版本却升不了”特别有用,比翻
composer.json手动找约束快得多
为什么 composer why 查不到某些包?
常见原因就两个:包根本没进依赖图,或者它被标记为 dev 或 provide 类型。
-
composer why只查require和require-dev解析出的真实依赖,不查replace、provide或conflict字段 - 如果你用
composer require --dev装了一个包,但当前不是--dev模式(比如生产环境 install),它就不会出现在依赖图里,why自然查不到 - 有些包是通过
repositories或path类型加载的,也可能导致路径不清晰,why输出为空或只显示root - 运行前先确认:
composer show vendor/package-name能否看到该包,看不到就说明它压根没被装上
替代方案:用 composer depends 查反向依赖(高级场景)
composer why 是单向查“谁引我”,而 composer depends(需 Composer 2.2+)可以查“我被谁依赖”,更接近“影响范围评估”。
- 用法:
composer depends vendor/package-name - 它会列出所有直接或间接依赖该包的包(包括 dev 依赖),比
why -a更全 - 如果想排除 dev 依赖,加
--no-dev;想看具体约束条件,加-v(verbose) - 注意:
depends不是所有 Composer 版本都自带,低版本会提示Command "depends" is not defined.,此时只能靠why -a+ 手动 grepcomposer.lock
composer why 开始就够了;真正要评估升级或移除风险,才需要 depends 或手动翻 composer.lock 的 packages 和 packages-dev 区块——那里才是最终生效的依赖快照。










