composer prohibits 能直接定位阻塞包,查 laravel/framework 升级到 11.x 应执行 composer prohibits laravel/framework:11.0.0(需完整版本号),它扫描依赖图找出所有通过 require、require-dev 或 conflict 明确排斥该版本的包,每行末尾 (for vendor/package vn.n.n) 即真实卡点。

composer prohibits 命令能直接定位阻塞包
想查哪个包卡住了 laravel/framework 升级到 11.x?composer prohibits 是唯一原生支持该需求的命令,不用手动翻 composer.json 或猜依赖树。
它会扫描整个依赖图,找出所有声明了与目标包版本冲突的 require、require-dev 或 conflict 规则的包。
执行方式很简单:
composer prohibits laravel/framework:^11.0
输出里每行是一个阻塞来源,格式为:vendor/package version → requires another-package:constraint。注意它不展开间接依赖,只显示“谁在 require 冲突规则”。
常见阻塞类型:require vs conflict 的区别要分清
阻塞可能来自两种机制,行为完全不同:
-
require冲突:某个已安装包(比如spatie/laravel-backup)在它的composer.json里写了"laravel/framework": "^9.0 || ^10.0",而你当前项目又 require 了它 —— 这是最常见的原因 -
conflict声明:某个包(如旧版nesbot/carbon)在自己composer.json中明确写了"conflict": {"laravel/framework": ">=11.0"},Composer 会严格拒绝共存
两者都会被 composer prohibits 列出,但修复方式不同:前者要等上游发新版,后者可尝试用 composer require --ignore-platform-reqs 强制跳过(不推荐生产环境用)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
升级前预检:加 --format=dot 可视化依赖链
如果 prohibits 输出一堆包看不清路径,加 --format=dot 能生成 Graphviz 可读的依赖关系图:
composer prohibits --format=dot laravel/framework:^11.0 | dot -Tpng -o deps.png
需要本地装 graphviz。生成的图里,箭头方向是「A → B」表示 A 直接 require B,能快速定位哪一层引入了冲突约束。
注意:--format=dot 不会自动过滤 transitive 依赖,所以图可能很密;建议先用普通模式缩小范围,再对关键包单独跑 dot。
为什么 composer update --dry-run 不够用
composer update --dry-run 只告诉你“升级失败”,但不会指出具体哪个包、哪条规则导致失败。尤其当多个包同时约束同一依赖时,它只会停在第一个报错点,后续阻塞被掩盖。
而 prohibits 是静态分析,不触发任何下载或解包,响应快、结果全。它甚至能查尚未安装但已出现在 composer.json 中的包(只要运行过 composer install 或有 lock 文件)。
一个容易忽略的点:如果 lock 文件过期或缺失,prohibits 可能漏掉某些间接约束 —— 它依赖 composer.lock 中记录的实际解析结果,不是纯靠 composer.json 推导。










