composer卡在resolving dependencies是sat求解器因循环依赖陷入无限回溯,非网络问题;需用composer update --dry-run -vvv定位卡点,再通过composer depends --tree确认闭环,并以抽离契约包、运行时解耦或降级为可选依赖重构。

Composer卡在Resolving dependencies是死锁,不是网络慢
看到这行输出后CPU持续拉满、终端无报错也无进展,基本就是SAT求解器陷入无限回溯——它在暴力尝试所有可能的版本组合,但约束图里存在循环依赖(比如package-a依赖package-b,而package-b又反向依赖package-a)。此时调http.timeout、换镜像、清缓存全无效。
先确认是否真卡死:
- 运行composer show -t --no-dev --ignore-platform-reqs | head -50,看是否有重复出现的包路径
- 在PowerShell中执行Get-Process php* | Where-Object {$_.CPU -gt 50} | Select-Object Id, ProcessName, CPU,观察是否有长期高占用的php.exe进程
- 不要用composer validate,它完全不检查依赖逻辑
Ctrl+C之后还有php.exe残留?用resmon精准杀掉
Windows下Ctrl+C虽能中断前台命令,但PHP子进程常被遗留,继续锁定vendor/目录导致后续composer install报“Could not delete”。别急着关机或重启IDE,直接定位并清理:
- 按
Win + R输入resmon回车 → 切到“CPU”选项卡 → 在“关联的句柄”搜索框输入vendorin或vendorsome-package(注意用反斜杠)→ 找到对应进程(如phpstorm64.exe、conhost.exe)→ 右键“结束进程” - 若没搜到,打开PowerShell执行:
Get-Process | Where-Object {$_.Path -like "*vendor*"} | Stop-Process -Force - 临时停用
Windows Search服务(尤其项目在C:Users下时),防止索引服务反复扫描vendor/并加锁
死锁状态下别乱删vendor和lock,先用--dry-run摸清问题点
删vendor/和composer.lock再跑composer update,大概率复现同样死锁,甚至引入新冲突。正确做法是让Composer自己暴露卡点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
composer update --dry-run -vvv,紧盯最后几行输出,看它卡在哪一个Trying:包上 - 对疑似包运行
composer prohibits vendor/package:version(例如composer prohibits psr/log:3.0.0),比why-not更快定位冲突源头 - 若输出里反复出现某个
dev-main或*约束,把它替换成具体稳定版本,或在composer.json里加"minimum-stability": "stable"
Generating autoload files卡住?大概率是WSL2或APCu问题
这一阶段已过依赖解析和下载,说明vendor/目录结构基本完整,但自动加载文件生成失败。常见于:
- WSL2环境下启用了
metadata,导致symlink解析极慢,可临时关闭:wsl --shutdown && wsl -d Ubuntu-22.04 --mount \?Volume{xxx} --options "metadata"(改用不含metadata的挂载方式) - CLI模式未启用
apcu扩展,autoload dump会退化为全量文件扫描,加php -d apc.enable_cli=1 composer dump-autoload试试 -
vendor/权限异常或磁盘空间不足,检查df -h和ls -la vendor/
真正容易被忽略的是:死锁往往不是单个包的问题,而是多个require-dev里的不稳定包通过间接路径互相拉取,最终在求解器里形成闭环。盯住--dry-run最后一行那个“无法降级”的叶子节点,比通读整个依赖树更有效。










