Composer why-not 是诊断命令,用于解释某包无法安装或更新的原因;它分析依赖约束、平台配置和冲突规则,输出具体拒绝原因,如PHP版本不兼容、已安装包版本冲突或缺少扩展等。

Composer why-not 是一个诊断命令,用来解释为什么某个包(或特定版本)无法被当前项目安装或更新。它不直接执行安装,而是分析依赖约束、平台配置、冲突规则等,输出清晰的拒绝原因。
查看具体包为何不可用
运行 composer why-not vendor/package:version(例如 composer why-not monolog/monolog:^3.0),Composer 会逐层检查:当前 composer.json 中的 require 规则、已安装包的版本锁定、PHP 或扩展版本限制、以及其他包的 conflict 声明。输出中会明确指出是哪条约束导致失败,比如:
- 你的项目 require 了
"php": "^8.1",但该包只支持^7.4 || ^8.0 - 已安装的
symfony/console是 v6.4,而目标包要求symfony/console:^5.4且声明了"conflict": {"symfony/console": ">=6.0"} - 你本地 PHP 没启用
ext-intl,但该包在require中声明了"ext-intl": "*"
配合 require 命令一起用更高效
如果只是想尝试安装却失败了,别先删 lock 文件或手动改配置。先运行 composer require vendor/package:version --dry-run 看报错,再补上 why-not 定位根因。这样能避免盲目升级或降级其他依赖引发新冲突。
注意作用范围仅限当前环境
why-not 分析基于你当前的 composer.lock、composer.json 和本地 PHP 配置。它不会模拟远程服务器环境,也不会猜测未来可能的版本组合。如果你在 CI 中遇到问题,需确保本地运行时使用相同的 PHP 版本和扩展。
替代方案:why 命令也值得了解
composer why vendor/package 回答的是“谁在依赖这个包”,用于清理无用依赖;而 why-not 是它的反向补充,专攻“为什么装不上”。两个命令配合使用,能快速理清依赖网络中的阻碍点与依赖链。










