composer prohibits用于反向查找已安装包中通过requires、conflict或replace字段明确排斥指定版本的约束,必须带精确版本号(如guzzlehttp/guzzle:^8.0),输出为空不表示无冲突,可能源于PHP版本、platform配置等隐式限制。

composer prohibits 不是“禁止包被引入”的拦截开关,它只是查谁写了硬性约束来挡路。 它不修改行为、不主动阻止安装,只告诉你:当前依赖图里,哪些已声明的包通过 requires、conflict 或 replace 字段,明确拒绝了你指定的版本。
prohibits 命令必须带版本号才能生效
不写版本,它就查 dev-main,而这个分支往往根本不存在或没被 require。结果为空不是没冲突,是命令根本没跑对目标。
- ✅ 正确:
composer prohibits guzzlehttp/guzzle:^8.0 - ✅ 正确:
composer prohibits monolog/monolog:v3.0.0 - ❌ 错误:
composer prohibits guzzlehttp/guzzle(默认查dev-main,大概率无输出) - ❌ 错误:
composer prohibits monolog/monolog:2.1(缺v或补全小数位,会报Package not found)
prohibits 只看 composer.json 里的声明,不扫描 vendor
它分析的是当前 composer.lock 已解析出的依赖快照,以及 composer.json 中所有 require、require-dev、conflict 字段——但不会去读已安装的 vendor/ 下某个包的源码 composer.json。所以:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果某私有包没在
repositories里配置,或网络不通,prohibits就会跳过它,导致漏查 - 删了
vendor/但没删composer.lock,命令输出仍是旧依赖关系,可能和实际环境脱节 -
conflict字段它能识别,但模糊写法如"conflict": {"other/package": ""}会被忽略——得靠why-not或手动翻源码
prohibits 和 why-not 的分工不能混用
前者是“谁拉黑了我”,后者是“为什么我进不来”。它们查的维度不同,输出也互为补充:
-
composer prohibits laravel/framework:^11.0:列出所有requires"laravel/framework": "^10.0"的包,比如spatie/laravel-backupv8.x -
composer why-not laravel/framework:11.0.0:除了上面那些,还会指出Your platform config requires php 8.1.0, but laravel/framework 11.0.0 requires php >=8.2.0 - 如果
prohibits输出为空,但why-not明确报 PHP 版本不匹配,说明拦路的是config.platform.php或真实运行环境,不是依赖声明
真正卡住更新的,往往是 requires + platform + minimum-stability 三者叠加后的隐式不满足。别只盯着 prohibits 一行输出,它只负责把“谁写了那行 constraint”指给你看——至于那行 constraint 本身合不合理、要不要改、能不能绕开,得你自己判断。

















