depends查“谁依赖我”,why查“我为什么被装上”;prohibits查版本冲突原因,why-not非真实命令,应结合prohibits与why分析或用--dry-run诊断。

depends 和 why 都是 Composer 提供的依赖分析命令,但视角相反、用途不同:前者查“谁依赖我”,后者查“我为什么被装上”。
depends:找“谁在用这个包”
列出所有直接或间接依赖指定包的项目或库。适合排查某个包是否被项目中其他依赖拖入,或评估移除某个包的影响范围。
- 默认只显示直接依赖(一级依赖),加
--tree可展开完整依赖路径 - 支持模糊匹配,如
composer depends monolog会匹配monolog/monolog - 若返回空,说明当前项目中没有包显式或隐式依赖它(可能未安装,或已被剔除)
why:查“为什么这个包存在”
解释 Composer 为什么把某个包安装进项目 —— 是你 require 的,还是被某个已安装包作为子依赖拉进来的。核心用于诊断“意外安装”或“版本冲突来源”。
- 必须指定已安装的完整包名(如
composer why symfony/http-foundation) - 输出会明确标注是
required by root(你手动 require),还是required by vendor/package(被其他包依赖) - 如果包未安装,命令直接报错:
Package not found
prohibits 和 why-not 不是内置命令
Composer 没有 prohibits 或 why-not 命令。你可能混淆了以下两个概念:
-
composer prohibits是 真实存在的命令(从 Composer 2.2+ 开始),用于查找哪些已安装包与目标包存在版本冲突(即“禁止安装”的原因),比如因conflict规则或 PHP 版本不兼容 -
why-not并不存在;想了解“为什么某个包没被安装”,应结合composer prohibits和composer why交叉分析,或使用composer update --dry-run查看尝试安装时的拒绝原因
实用组合建议
- 想删包但怕影响功能?先跑
composer depends看谁靠它活着 - 发现一个陌生包出现在
vendor/?用composer why追源头 - 执行
composer require失败提示冲突?立刻用composer prohibits找出拦路虎










