composer why-not是检测依赖死锁的起点,不是备选方案;它不模拟安装、不修改文件,仅从目标包反向遍历composer.json和composer.lock中的require、conflict及platform约束,精准输出首个不可绕过的硬冲突点,如conflicts行即为真死锁。

利用Composer库封装可配置的PHP分布式死锁检测器

先别急着删 composer.lock 或者盲目改版本约束——遇到 root requirements could not be resolved 这种报错时,真正的第一步是跑一下 composer why-not。这玩意儿是唯一一个能立刻告诉你“到底谁在拦路”的只读命令。它不模拟安装、不修改任何文件,只是从目标包出发,反向遍历当前 composer.jsoncomposer.lock 里所有的 requireconflict 以及 platform 约束,然后输出第一个根本绕不过去的硬冲突点。

不过有几个常见坑得注意:

用 composer prohibits 主动扫描阻断源头

假设你打算升级主框架到 Lara vel 11,但还没写进 composer.json 里,这时候 composer why-not 会直接返回空——因为它只检查已经注册的依赖。换个思路,该用 composer prohibits。这个命令不等你“想装什么”,而是主动扫描整个依赖图,把所有明确写着排斥目标版本的包都给列出来。

实操建议:

依赖树分析:用 show -t --no-dev 定位循环引用

composer install 卡住不动、CPU 持续飙升、内存暴涨,大概率不是网络慢,也不是包不存在,而是依赖图里出现了 a → b → a 这种强循环。SAT 求解器在无限回溯,怎么也解不开。

关键操作:

封装可配置检测器:核心是命令组合与参数隔离

所谓的“可配置的 PHP 分布式死锁检测器”,本质上不是写什么新逻辑,而是把 why-notprohibitsshow -t 这三类命令封装成一个统一入口,同时做好参数隔离。比如可以做一个 CLI 工具,接受 --target--mode=why-not|prohibits|tree--include-dev 等开关,内部根据模式调用对应命令并过滤输出。

有几个注意事项:

本文转载于:https://www.php.cn/faq/2820187.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。