卡在“resolving dependencies through sat”不是缓存问题,而是依赖冲突导致sat求解器暴力回溯;应优先用composer why-not定位阻断链,清缓存仅对元数据损坏或下载异常有效。

Composer缓存清理不是“删了就快”,而是要分清哪层卡住、哪类缓存该动、哪类动了反而坏事——尤其当 composer install 卡在 Resolving dependencies through SAT 时,清缓存根本没用。
卡在 Resolving dependencies 是缓存问题吗?
不是。这是 Composer 的依赖求解器在暴力回溯版本约束,本质是 composer.json 里存在逻辑冲突(比如同时 require "laravel/framework": "^10.0" 和 "spatie/laravel-permission": "^5.0",而后者尚未适配 Laravel 10)。此时:
- 运行
composer update -vvv --profile,若日志停在Resolving dependencies through SAT→ 立即停止,这不是缓存问题 - 改用
composer why-not vendor/package:version定位阻断链(例如composer why-not laravel/framework:10.42.0) - 盲目执行
composer clear-cache或删~/.composer/cache不会改变结果,只会浪费时间
缓存真损坏了,怎么确认并清理?
真正需要清缓存的典型现象是:corrupted archive、zlib_decode() error、反复下载同一包却校验失败,或 composer install 明明该拉新包却秒完成(疑似复用旧缓存)。操作前必须验证:
- 先查真实路径:
composer config --global cache-dir - Linux/macOS 看大小:
du -sh $(composer config --global cache-dir);Windows 直接打开%APPDATA%\Composer\Cache查属性 - 若缓存目录下
files/或repo/子目录存在大量修改时间超过半年的文件,可手动删:rm -rf ~/.composer/cache/files/*(只清 dist 包)或rm -rf ~/.composer/cache/repo/*(只清元数据) - 权限异常常见于曾用
sudo composer install→ 普通用户运行clear-cache会静默失败;此时直接rm -rf $(composer config --global cache-dir)更可靠
强制重装依赖:删 vendor + 清缓存 + 关键参数
仅删 vendor/ 或仅清缓存都不够,Composer 仍可能从缓存重建部分依赖。真正“从零开始”需三步闭环:
- 删掉整个
vendor/:rm -rf vendor/(Linux/macOS)或rmdir /s vendor(Windows) - 清空磁盘缓存:
composer clear-cache - 用关键参数重装:
composer install --no-cache --prefer-dist --optimize-autoloader --no-dev。--no-cache是核心,它禁用本次所有缓存查找;--prefer-dist避开 git clone 开销;--no-dev跳过开发依赖,大幅缩短解析时间
配置刷新:cache-files-ttl 和 cache-files-maxsize 怎么调?
默认缓存策略对多数项目偏保守(6个月 TTL、300MiB 上限),但调整需看场景:
- CI/CD 流水线频繁构建 → 把
cache-files-ttl设为86400(1天),避免旧包残留干扰;加到composer.json的config块里:{"config": {"cache-files-ttl": 86400}} - 本地开发机磁盘紧张 → 调小
cache-files-maxsize到"200MiB",但注意:设太小会导致 Composer 频繁触发 GC,反而增加 I/O 开销 - 团队共享镜像源 → 启用
cache-read-only(true),防止不同成员写冲突;但首次 install 会变慢,因无法写入 repo 缓存 - 改完配置后无需重启,下次
composer install自动生效;但已存在的过期缓存不会立刻删,得等composer clear-cache --gc触发垃圾回收
最易被忽略的一点:Composer 插件(如旧版 hirak/prestissimo)可能在 ~/.composer/cache/ 下建私有子目录,clear-cache 不清理它们。这类缓存得按插件文档手动删,否则仍会复用旧数据。











