composer prohibits更管用,因为它从目标包出发反向追溯所有直接/间接阻止安装的依赖约束,而why-not仅检查composer.json中已声明但未安装的包;prohibits必须带精确版本号,输出明确指向冲突源头。

composer prohibits 为什么比 why-not 更管用
因为 composer why-not 只查你 composer.json 里写了但没装上的包,而 composer prohibits 是从你想装却装不上的那个包出发,一层层翻出所有拦路的依赖约束。比如你执行 composer require laravel/framework:^11.0 报错,why-not laravel/framework:11.0.0 很可能返回空——它压根没在你的 JSON 里声明过;但 prohibits laravel/framework:11.0.0 就能立刻指出是 spatie/laravel-backup 的某个旧版要求 symfony/console ^5.4,和 Laravel 11 要的 ^6.4 直接对撞。
必须注意:prohibits 后面得跟完整版本号(如 laravel/framework:11.0.0),不能写 ^11.0,否则会报 [InvalidArgumentException] Package not found。输出里每行末尾的 (for spatie/laravel-backup v7.2.0) 就是真正卡死你的源头。
composer update --dry-run -v 看懂冲突在哪一行
这个命令不改任何文件,但会把 Composer 的整个依赖求解过程摊开给你看。重点盯三处:
- 末尾几行的
Because...链,比如Because package-a v2.1 requires monolog/monolog ^1.25, and package-b v3.0 requires monolog/monolog ^2.10—— 这就是无交集的铁证 -
Root requirements段落,告诉你哪条"vendor/name": "^x.y"是整场冲突的起点 -
Found conflicting requirements下列出的具体包名和版本范围,它们才是你要动手调的对象
别跳过 -v 参数,没有它,你只看到“无法解析”,有了它,才能看见“谁在拉扯谁”。
composer show --tree 查清谁偷偷引入了冲突包
composer show --tree 输出的是当前 composer.lock 已成功解析的依赖结构,不是理想状态,而是真实现场。它能帮你发现那些“你以为没装、其实早被 dev 包拖进来的”冲突源。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
常见陷阱:
- 你项目里没直接 require
monolog/monolog,但phpunit/phpunit和laravel/sail分别把它拉进来,且版本不一致 → 树里会出现两条路径指向不同monolog版本 -
your-project-name出现在树顶,说明composer.json的require-dev或conflict字段正在参与求解,哪怕你只跑composer install - 某些包通过
replace声明自己是psr/log,但实际行为不兼容,show --tree会暴露这种“冒名顶替”
composer show vendor/name x.y.z 确认某版本到底要什么
当你怀疑某个包的某版本是冲突元凶,别猜,直接查它发布时的原始约束。运行 composer show vendor/name x.y.z,它会打印出该版本 composer.json 里的完整 require、conflict 和 php 字段。
关键点:
- 看
conflict字段:有些包明确写着"conflict": {"laravel/framework": ">=10.0.0"},这种硬排斥不会在 require 阶段报错,只在 resolve 阶段爆掉 - 对比 PHP 版本要求:
php: ^8.1和你本地的php -v结果是否匹配?不匹配就不用往下试了 - 确认扩展依赖:比如某版本 require
ext-gd,而你服务器没开 GD 扩展,show会提前预警
真正麻烦的从来不是“找不到包”,而是“找到了,但它拒绝和你现有环境握手”。这一步不做,后面所有操作都是蒙眼打架。










