“your requirements could not be resolved”是sat求解失败,非网络或lock损坏;应运行composer update --dry-run -v查看末尾冲突链,再用composer why-not精准定位阻断包,并检查php版本、platform配置及require-dev影响。

“Your requirements could not be resolved” 不是网络问题,也不是 composer.lock 损坏,而是 Composer 在 SAT 求解过程中发现你写的约束组合在所有已知版本中无解。
运行 composer update --dry-run -v 看清冲突断点
这个命令不改任何文件,但会完整执行依赖解析,并在末尾明确指出第一个无法调和的冲突。关键看输出最后 10 行:
- 盯住 “Found conflicting requirements” 后面紧跟着的两行,比如
Because package-a v2.1 requires symfony/console ^5.4和and package-b v3.0 requires symfony/console ^6.0 - 注意 “Root requirements” 段落——它直接对应你
composer.json里某一行,例如"laravel/framework": "^10.0"就是整条链的起点 - 如果输出太长,用
tail -n 20或直接滚动到底部,别从头读
用 composer why-not 定位谁在拦路
当你怀疑某个包装不上(比如 monolog/monolog:2.0.0),就查它被谁明确拒绝:
- 必须写全约束格式,如
composer why-not monolog/monolog:^2.0.0,不能只写monolog/monolog或2.0 - 输出从下往上读:最后一行是你自己写的依赖,往上每行末尾的
(required by xxx)是实际卡死你的包 - 如果看到
spatie/laravel-backup v7.2.0 requires symfony/console ^5.4,那真正要调的不是 backup,而是symfony/console
用 composer prohibits 反向查谁锁死了旧版
当冲突表现为“升不了新版本”,说明有别的包在强制拉旧版:
- 例如
composer prohibits monolog/monolog:^2.0会列出所有要求monolog/monolog≤1.x 的包 - 常见于测试工具(如
phpunit/phpunit)或老插件,它们的composer.json里写了"require": {"monolog/monolog": "^1.25"} - 结果里若出现
require-dev下的包,立刻试composer update --no-dev验证是否 dev 工具链拖后腿
检查 PHP 版本与 platform 配置是否自相矛盾
Composer 解析时会严格按 PHP 版本过滤包,而你本地环境、config.platform.php、composer.json 里的 "php" 字段三者可能不一致:
- 运行
php -v确认 CLI 实际版本;再查目标包的composer.json中"require": {"php": "..."}是否匹配 - 如果
composer.json里有"config": {"platform": {"php": "8.1.0"}},Composer 就假装自己在 8.1 下跑——哪怕你本地是 8.5,也会把要求^8.2的包直接过滤掉 - 临时验证可删掉
platform.php再--dry-run,但上线前必须确保代码真兼容该版本
最常被忽略的是:require-dev 中的包全程参与依赖求解,哪怕你只执行 composer install;而 composer.lock 里记录的不仅是版本,还有它当时解析所用的 PHP 环境和 stability 策略——换环境不重跑 --dry-run,就等于闭眼调试。











