composer why-not 是唯一能定位阻塞链的命令,报错出现“don’t install”即证明约束无交集,需立即执行该命令逆推冲突路径,输出从下往上读,末行是根声明,每行末尾(required by)指明互斥来源。

composer why-not 是唯一能定位阻塞链的命令
报错里出现 Conclusion: don't install vendor/package:version,说明 Composer 已证明无解,不是网络或缓存问题,而是约束之间根本没交集。此时别翻日志、别删 composer.lock、更别试 --ignore-platform-reqs —— 那只会掩盖 PHP 版本不匹配导致的 runtime 崩溃。
立刻运行:composer why-not vendor/package:version(例如 composer why-not monolog/monolog:2.9.0),它不依赖 lock 文件或本地缓存,直接从 Packagist 元数据逆推阻塞路径。
- 输出从下往上读:最后一行是
Root package requires,对应你composer.json里那条手动写的约束 - 中间每行末尾带
(required by package-name),就是某层依赖提出的互斥版本要求 - 如果第一行就显示
php: 7.4,而目标包要求^8.1,升级 PHP 或换旧版包才是正解 - 不写完整版本号会报
[InvalidArgumentException] Package not found
为什么 composer depends 不适合查冲突
composer depends 只回答“谁依赖这个包”,但不体现版本约束强度。比如 laravel/framework 声明 "symfony/console": "^5.4",而另一个包要求 "^6.0",depends 会列出两者,却无法告诉你哪条约束更窄、谁在卡死解析。
真正要查的是“谁不让装”,不是“谁用了它”。这时必须用 composer depends -r vendor/package(加 -r 才递归),重点看带 requires 的行,例如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
laravel/framework v8.83.27 requires symfony/console (^5.4)
注意:^5.4 和 ~5.4.0 允许的版本范围不同,可能就是冲突触发点。
composer show --tree 验证实际装了什么版本
composer.json 是愿望清单,vendor/ 和 composer.lock 才是事实。运行 composer show --tree vendor/package(如 composer show --tree monolog/monolog)能看清真实依赖树,尤其注意:
- 某行末尾标着
(locked to 2.9.9)→ 这个版本被composer.lock固定,不删 lock 或不update就不会变 - 树中某节点写的是
"guzzlehttp/guzzle": "2.*"→ 它硬把主版本钉死在 2.x,哪怕你composer.json写了^7.0 - 用
grep -A5 -B5 "laravel/framework"快速过滤关键路径,避免在几百行输出里盲找
如何验证冲突是否真被解决
改完 composer.json 或升级某个插件后,别急着 composer update 全量刷新——容易引入新冲突。用三步闭环验证:
- 先跑
composer why-not vendor/package:version,确认目标版本不再被阻塞 - 再执行
composer install --dry-run,看是否能完成解析且无 warning - 最后检查
composer.lock中对应包的"version"和"source"字段,确认版本号符合预期、来源是官方源而非私有镜像或 fork
最常被忽略的是 require-dev 里的包:比如 phpunit/phpunit 拉高了 sebastian/exporter 版本,间接锁死 symfony/console,但它不在运行时依赖里。这种冲突必须用 composer prohibits vendor/package:version 或 composer update --no-dev 来交叉验证。

















