清缓存后依赖仍无法安装,主因是 composer.json 中存在不可满足的 require/conflict 组合导致 SAT 回溯卡死,与缓存无关;需用 composer update -vvv --profile 定位卡点,并通过 composer why-not 定位冲突源头。

缓存清理后依赖仍无法安装,大概率不是缓存没清干净,而是 Composer 正在暴力回溯版本约束——它卡在 Resolving dependencies through SAT,本质是 composer.json 里存在不可满足的 require/conflict 组合,跟缓存无关。
先确认是不是真卡在 SAT 回溯
运行 composer update -vvv --profile,盯住最后几行输出:
- 如果停在
Resolving dependencies through SAT→ 是逻辑冲突,不是网络或缓存问题 - 如果卡在
Downloading https://...或Reading /packages.json from cache→ 才要查镜像、TLS 或磁盘权限 - 如果报
Corrupted zip file或Failed to extract→ 缓存 ZIP 损坏,但只删了~/.composer/cache/files/下对应 ZIP 就够,不用全清
为什么清完缓存还装不上?关键在 lock 文件和 vendor 状态
composer install 的行为完全由 composer.lock 驱动。清缓存 ≠ 重解析依赖:
- 只删
vendor/不删composer.lock→ Composer 仍会从缓存解压旧包,甚至不发网络请求 - 只删
composer.lock不清缓存 → 可能复用已损坏的 ZIP,校验失败后直接报错 - 删了两者但没加
--no-cache→ 它仍会尝试读~/.composer/cache/files/下的 ZIP,哪怕你刚清过
真正“重来”必须三者同步:删 vendor/ + 删 composer.lock + composer clear-cache + composer install --no-cache。
绕过 SAT 卡死:用 why-not 定位真实阻断点
当想装某个包却失败(比如 laravel/sanctum),别等 SAT 跑完,直接问谁挡路:
composer why-not laravel/sanctum:^4.0
输出会逐层列出所有冲突源头,常见有:
-
laravel/framework的require锁死了symfony/http-foundation版本 - 你自己
composer.json里的conflict规则碰上了新包的依赖 - 某全局 require 的插件(如
laravel/installer)间接锁定了根项目可选范围
拿到阻断链后,要么降级冲突包,要么显式 require 中间版本打破循环,比盲目删删删快得多。
最常被忽略的一点:CI/CD 流水线里 composer.lock 若含旧镜像源地址(比如写死 packagist.org),即使本地切了阿里云镜像,构建时依然走不通——必须确保 lock 文件本身是用当前镜像配置生成的。


















