composer clear-cache 清不掉旧版本包是因为它只全量清理缓存子目录而不识别版本新旧;精准清理需用 --gc 参数触发基于TTL和大小限制的垃圾回收,或手动删除指定版本文件夹,同时vcs缓存需单独处理。

composer clear-cache 为什么清不掉旧版本包?
因为 composer clear-cache 默认只清空缓存目录下的 files/、repo/、vcs/ 子目录,但不会判断“哪些是旧版本”,它是一次性全量清理——也就是说,哪怕你刚装完 Laravel 11,它也会把 Laravel 9 的 ZIP 包一并删掉。真正需要精准剔除旧版的场景,得靠手动或配置驱动的垃圾回收。
用 --gc 参数触发自动过期清理
Composer 内置了基于 TTL(生存时间)和大小限制的垃圾回收机制,composer clear-cache --gc 就是调用这个逻辑:它只删那些超过 cache-files-ttl(默认 6 个月)且未被最近安装/更新命中的包文件,保留活跃依赖的缓存。
-
cache-files-ttl控制单个 ZIP/TAR 文件的过期时间,单位秒;可全局设置:composer config --global cache-files-ttl 2592000(30 天) -
cache-files-maxsize控制整个files/目录上限,默认 300MiB;超限后 GC 会优先删最旧的文件 - GC 不清理
vcs/或repo/,只动files/下的 dist 包
手动删指定旧版本包更准,但必须避开这些坑
如果你知道某个包(比如 monolog/monolog)的 v1.x 已彻底不用,想只删它的历史 ZIP,可以进缓存目录精准操作:
- 先查真实路径:
composer config --global cache-dir - 进入
$(composer config --global cache-dir)/files/,里面是按 vendor/name 命名的子目录 - 找
monolog/monolog目录,里面每个子目录对应一个版本(如1.27.0、1.28.0),删掉不需要的版本文件夹即可 - ⚠️ 删之前确认没有
composer install或update进程在运行,否则可能写入一半被中断,后续报Corrupted cache file - ⚠️ 不要直接
rm -rf files/*—— 这会误删正在被其他项目使用的活跃包
vcs 缓存必须单独处理
vcs/ 目录存的是 Git 裸仓库克隆(比如 GitHub 上某个 dev-master 分支),它不受 --gc 管控,也不随 clear-cache 删除。一个裸仓库常占 300–800 MB,且容易耗尽 inode,尤其当你频繁切分支或用 private repo 时。
- 安全做法:先确认哪些 VCS 缓存还在用,执行
composer show --all | grep -E "source|dist"看当前项目实际拉取来源 - 再进
$(composer config --global cache-dir)/vcs/,按 URL hash 查对应目录(如github.com-xxx),只删已废弃项目的 hash 目录 - 长期方案:禁用 VCS 缓存,加配置
composer config --global cache.vcs false,强制走 dist 包
install 变成纯网络拉取。


















