php方案 PHP的Composer依赖解析

php方案 PHP的Composer依赖解析 Composer 解析依赖的核心是个SAT求解器把所有包的版本约束当成一堆布尔方程找一组同时满足所有条件的版本组合。 版本约束语法{require:{monolog/monolog:^2.0,guzzlehttp/guzzle:~7.4,symfony/console:6.0 7.0,some/package:*}}^2.02.0.03.0.0最常用允许 minor/patch 升级~7.47.4.07.5.0只允许 patch 升级67手动指定范围*任意版本别用太危险 解析过程 读 composer.json └─ 从 Packagist 拉所有候选版本的元数据 └─ 建依赖图每个包又依赖什么 └─SAT求解器找一组互相兼容的版本 └─ 写入 composer.lock 遇到冲突就回溯换一个版本组合再试直到找到解或者报错。 调试解析结果# 为什么装了这个包谁依赖它composer why guzzlehttp/guzzle# 为什么装不了某个版本composer why-not symfony/console7.0# 某个包被哪些包依赖composer depends monolog/monolog# 是什么阻止了某个包安装composer prohibits php8.3常见冲突场景# 两个包要求同一个包的不兼容版本# Package A requires monolog ^1.0# Package B requires monolog ^2.0# → Composer 报错无解# 解决方式1找支持同一 monolog 版本的 A/B 版本composerrequirea/package:^2.0b/package:^3.0# 解决方式2用 conflict 字段在自己的 composer.json 里声明{conflict:{bad/package:2.0}}加速解析# 只更新指定包不动其他避免全量重解析composer update monolog/monolog--with-dependencies# 看解析过程详情composer update-vvv21|grepselecting# 用 Composer 2 的并行下载默认已开启composer config--globalpreferred-install dist 锁文件的作用# 开发环境按 lock 文件装保证和别人版本一致composer install# 重新解析可能升级版本更新 lock 文件composer update# CI 里永远用 install不用 update---一句话Composer 把版本约束转成SAT问题求解composer why-not 是排查冲突最好用的命令CI里只跑 install 不跑 update。