“No dependencies exist”是正常现象,说明该包为根依赖,直接写在composer.json的require或require-dev中;此时应grep确认,再用composer depends查使用方或解析installed.json溯源。

composer why 返回 “No dependencies exist” 是正常现象
这说明你查的包是根依赖——它直接写在 composer.json 的 require 或 require-dev 里,不是被其他包带进来的。命令没失效,是设计如此。
验证方法很简单:grep -n "vendor/package" composer.json。如果命中,就确认是你自己加的;此时 composer why 永远不会输出路径。
- 想查“谁在用它”,得换
composer depends vendor/package(Composer 2.2+) - 如果
depends也空,说明它当前没被任何已安装包 require,只是闲置在vendor/里 -
composer show vendor/package必须有输出,否则why根本不工作——它只读composer.lock,不看文件系统
查不到完整路径?必须加 --tree 和 --dev
composer why vendor/package 默认只返回一条最短路径(字典序最小),且不递归。很多情况下它只显示一层,比如 laravel/framework → monolog/monolog,但不会告诉你 laravel/framework 是谁拉进来的。
真正能看清源头的命令是:composer why --tree vendor/package。它会输出类似:
my-project
└── laravel/framework ^10.0
└── monolog/monolog ^2.0
注意两点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果路径在某一层中断(比如停在
psr/log就没了),大概率是上游包用了"provide": {"psr/log-implementation": "*"},why --tree不会展开虚拟包 - 包只在
require-dev中(如phpunit/phpunit),不加--dev就查不到;而--no-dev会直接屏蔽整条 dev 链路 - 刚改完
composer.json但没composer update,--tree显示的是旧锁文件里的链路,不是你期望的新结构
为什么 composer why 报 “Package not found”
这不是包没装,而是它不在当前 composer.lock 的依赖图中。常见原因:
- 包名拼写错误:大小写、斜杠、连字符都敏感,
monolog/monolog≠Monolog/Monolog≠monolog/monolog-dev - 它只存在于
vendor/但没被记录进composer.lock(比如手动cp进去、或install失败后残留) - 项目还没运行过
composer install或composer update,composer.lock缺失或过期 - 被
replace或provide声明替代后 fallback 安装,why只认显式require,不追溯提供方
排查顺序固定:composer show vendor/package → 有输出再跑 why;无输出就先解决安装问题。
比 why 更可靠的溯源方式:直接读 installed.json
当命令行结果混乱、版本跳变、或 Composer 版本太旧时,vendor/composer/installed.json 是唯一权威来源。它记录每个包实际是被谁 require 的,包括 require-dev 和真实版本号。
操作步骤:
- 打开
vendor/composer/installed.json - 搜索目标包名,找到对应项的
require字段(注意是小写键名) - 检查
type是否为library,排除metapackage或project - 若
parent字段为空,说明它是根依赖;若有值,则是那个包把它拉进来的
这个文件不受 --no-dev 影响,也不受 provide 干扰,是调试复杂依赖冲突时最不容易被绕过的依据。

















