Composer卡在“Resolving dependencies”本质是SAT求解器暴力回溯版本冲突,非网络问题;用composer update -vvv --profile定位卡点,若停在“Resolving dependencies through SAT”即为约束不可满足,此时应优先运行composer why-not直击阻断链。

Composer 卡在 “Resolving dependencies” 或 “Updating dependencies” 不是网络问题,大概率是 SAT 求解器正在暴力回溯——它卡在逻辑冲突里,而不是下载慢。
怎么看清卡在哪一步?用 -vvv --profile 定位真实瓶颈
盲目换镜像、删缓存、重启终端,90% 是白忙。先让 Composer 吐出真实行为:
-
composer update -vvv --profile会显示每一步耗时和最后停驻点 - 如果日志卡在
Resolving dependencies through SAT—— 确认是版本冲突,不是网络 - 如果卡在
Reading /packages.json from cache或Downloading https://...—— 才是镜像/网络问题 - 如果卡在
Downloading vendor/package.zip—— 检查 TLS 握手、代理或源站响应(比如阿里云 mirrors 子域已停用)
为什么 composer why-not 是解决递归冲突最直接的切口
composer why-not 不是“为什么不能装”,而是“谁在阻止这个版本共存”。它把嵌套多层的约束链一次性展开,比手动翻 composer.json 高效得多:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 例如你想装
monolog/monolog:3.0.0却失败,运行:composer why-not monolog/monolog:3.0.0 - 输出里每一行都是一个阻断点:可能是
laravel/framework的require,也可能是你根composer.json里的conflict - 若出现
your-project,说明你自己的配置写了硬冲突,不是第三方包的问题 - 注意
require-dev同样参与解析——phpunit/phpunit要求 PHP 8.2,但项目只支持 7.4,也会卡死
绕过 SAT 回溯:用 --with-all-dependencies 或 replace 收口
当项目有 30+ 包、含私有仓库或 dev 分支时,SAT 求解可能超 10 分钟。这时与其等它穷举,不如主动收口:
-
composer update --with-all-dependencies跳过部分兼容性校验,快速生成 lock 文件(适合 CI) -
replace告诉 Composer:“这个包我已有实现,别再找兼容版本了”,例如:"replace": {"psr/log": "3.0.0"} -
conflict封杀已知死路,例如:"conflict": {"symfony/console": "=10.0"},避免求解器浪费时间 - 慎用
--no-plugins --no-scripts:插件可能引入隐式约束,关掉后有时能绕过卡点,但上线前必须开回来验证
锁文件损坏或手动编辑后行为异常怎么办
composer.lock 不只是依赖快照,它固化了所有解析决策:dist URL、commit hash、fork 来源。Git merge 冲突后误保留旧 hash,会导致 install 下载错包甚至校验失败:
- 运行
composer install -vvv,观察是否卡在Verifying archive integrity或报Invalid zip file - 确认
composer.lock与当前composer.json兼容:删掉vendor/和composer.lock,再跑composer install - 不要手动编辑
lock文件中的content-hash或dist字段——它们由 Composer 自动计算,改错就废 - CI 环境中优先用
composer install(读 lock),而非composer update(重算)
真正难处理的从来不是“卡住”,而是卡住后不知道是约束不可满足、还是镜像失效、或是 lock 文件被污染。每种情况对应完全不同的命令和判断路径,混用只会延长故障时间。

















