composer 没有 prohibits 命令,所有稳定版(v2.2–v2.7)执行均报错;替代方案是 composer why-not vendor/package:version,用于精准定位版本冲突原因。

Composer 没有 prohibits 命令——运行它会直接报错:Command "prohibits" is not defined. 这是当前(2026年)所有稳定版 Composer(v2.2–v2.7)都不支持的伪命令。网上所谓“composer prohibits”教程,要么混淆了旧版实验功能,要么抄错了文档。
为什么你搜到的 prohibits 用法全都不 work
官方从未发布过 prohibits 子命令。它不是拼写错误,也不是隐藏功能,而是真实不存在。你看到的示例大多来自早期社区误传、AI幻觉生成,或把 why-not 和 depends 的组合效果张冠李戴了。
- 真正能反向查“谁在阻止某版本安装”的命令是
composer why-not vendor/package:version(例如composer why-not monolog/monolog:^3.0) -
composer prohibits在任何 Composer 版本中执行,结果都是明确报错,不会输出依赖树或冲突路径 - 部分 IDE 插件或自定义脚本可能封装了类似逻辑,但那不是 Composer 原生命令
composer why-not 怎么精准定位降级失败原因
你想把 guzzlehttp/guzzle 从 ^8.0 降级到 ^7.5,但 composer require guzzlehttp/guzzle:^7.5 报 Your requirements could not be resolved?这时该用 why-not 看硬性卡点:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须指定**合法版本标识**:用
^7.5、v7.5.0或7.5.*,不能只写guzzlehttp/guzzle:7(Composer 无法解析模糊数字) - 它只检查
require和require-dev中已声明的约束,不会扫描代码里new或use的实际调用 - 输出里出现
myapp/core requires guzzlehttp/guzzle ^8.0,就说明问题不在底层包,而在你自己的composer.json或某个私有 SDK - 如果没输出任何行,说明没有显式约束阻止——真凶可能是
conflict字段、platform.php锁定,或composer.lock内容哈希校验失败
当 why-not 也沉默时,下一步查什么
why-not 返回空,并不等于没冲突。常见静默卡点包括:
-
composer.json里写了"config": {"platform": {"php": "8.1.0"}},而你本地是 PHP 8.2 —— Composer 会假装在 8.1 下解析,导致某些仅支持 8.2+ 的包被排除,且why-not不提示 - 某个依赖包的
composer.json含"conflict": {"php": ">=8.2"},这种排斥是硬性的,但why-not只报“require”链,不报conflict -
composer.lock文件损坏或内容哈希与composer.json不匹配,此时先跑composer update --dry-run,看是否在“Resolving dependencies”阶段就中断 - 用了
replace或provide声明(如"psr/log-implementation": "monolog/monolog"),这类虚拟关系不会出现在why-not输出中
真正卡住更新的,往往不是某个命令没跑对,而是多个约束叠加后产生的隐式不可满足性——比如平台配置 + conflict 字段 + require-dev 里的测试工具,三者合力封死了一条路径。这时候光盯一个命令没用,得把 --dry-run -v、why-not、show --tree 和删锁重装(仅限调试)轮着试。










