composer why 和 composer why-not 是 Composer 依赖分析的核心诊断工具:why 查包被谁依赖,why-not 查版本冲突原因,支持 --direct、--tree 等参数及缩写,可快速定位依赖问题。

这两个命令专门用来查清某个包为什么被安装,或者为什么无法安装,是 Composer 依赖分析中最直接的诊断工具。
composer why:查清楚“谁在用这个包”
当你想确认某个已安装的包为何存在,比如 monolog/monolog,运行:
composer why monolog/monolog
它会列出直接或间接依赖它的顶层包(即你项目中 require 的包),并显示依赖链路。例如输出可能是:
- laravel/framework v10.32.1 → monolog/monolog ^2.8
- spatie/laravel-backup 8.5.0 → monolog/monolog ^2.0
说明 Laravel 框架和备份包都拉入了 monolog。如果只关心直接依赖,加 --direct 参数:
composer why --direct monolog/monolog
composer why-not:查清楚“为什么装不上这个版本”
当你执行 composer require some/package:2.0 报错说版本冲突,就用它定位卡点:
composer why-not some/package:2.0
它会告诉你哪些已安装的包锁死了某个不兼容的依赖。例如输出:
- myapp/core 1.2.0 requires guzzlehttp/guzzle ^7.2
- some/package 2.0 requires guzzlehttp/guzzle ^8.0
这说明 myapp/core 和 some/package 对 Guzzle 版本要求冲突,必须升级 core 或降级 package 才能共存。
实用小技巧
- 命令支持缩写:composer why monolog 等同于完整包名
- 配合 --tree 查看完整依赖树(仅
why支持) - 若提示 “No version set”,说明该包未被当前 lock 文件收录,可能已被移除但缓存残留,先 composer update --lock 再试
- 排查时优先检查 require-dev 中的包——它们也可能拖住主依赖版本
基本上就这些。用熟了,比翻 composer.lock 还快。










