composer clear-cache 默认不清理 vcs/ 目录和镜像元数据缓存(如 https---mirrors.aliyun.com-composer),导致磁盘空间未释放或无法拉取新包;vcs/ 单个裸仓库常占 300–800 mb 并耗尽 inode,需手动 rm -rf $(composer config --global cache-dir)/vcs/* 清理;镜像元数据缓存也须单独删除对应转义路径,且 ci/cd 中必须加 --no-interaction 避免卡住。

composer clear-cache 默认不清理 vcs/ 和镜像元数据缓存,这是导致“清了缓存却仍拉不到新包”或“磁盘空间没变”的最常见原因。
为什么 composer clear-cache 清不掉镜像元数据
它只删 ~/.composer/cache/repo/ 下的快照(如 packages.json),但镜像源(如阿里云)的元数据缓存路径是转义后的 URL 目录,例如:https---mirrors.aliyun.com-composer。这个目录不在 clear-cache 的默认清理范围内,而它恰恰是“composer show 看不到新包”的罪魁祸首。
- 手动验证是否同步到位:
curl -I https://mirrors.aliyun.com/composer/p/monolog/monolog.json,看Last-Modified时间是否接近当前 - 精准清理对应镜像元数据:
rm -rf ~/.composer/cache/repo/https---mirrors.aliyun.com-composer(Linux/macOS) - Windows 路径需转义:把
:换成---,斜杠换成-,例如C:\Users\user\AppData\Roaming\Composer\Cache\repo\https---mirrors.aliyun.com-composer
vcs/ 目录才是磁盘和 inode 的真实杀手
单个 Git 裸仓库(比如 laravel/framework 的 shallow clone)常占 300–800 MB,且每个都生成上万个文件,极易耗尽 inode。而 composer clear-cache 默认跳过 vcs/ —— 它根本不会碰这里。
- 先确认占用:
du -sh $(composer config --global cache-dir)/vcs(Linux/macOS) - 安全清理:
rm -rf ~/.composer/cache/vcs/*,下次需要时会自动重建 - Windows 执行:
rd /s /q "%APPDATA%\Composer\Cache\vcs" - 查 inode 是否爆满:
df -i,若使用率 ≥95%,报No space left on device很可能就是vcs/导致的
CI/CD 中清理失败,大概率卡在交互或路径错位
GitHub Actions、GitLab CI 等环境没有 TTY,composer clear-cache 默认会 hang 住等待确认;更隐蔽的问题是,缓存路径可能被 COMPOSER_CACHE_DIR 或 NFS 挂载覆盖,clear-cache 只清它认的那个路径。
- 必须加
--no-interaction:否则构建直接卡死 - 务必先
--dry-run:运行composer clear-cache --dry-run,确认输出路径是否指向你预期的位置(比如不是挂载点) - 检查实际路径:
composer config --global cache-dir,别信默认值 - 后台进程锁目录?Linux/macOS 用
lsof +D $(composer config --global cache-dir),Windows 用handle.exe -p php.exe
清完还是装不到新版?问题根本不在缓存
缓存再干净,composer install 也会严格按 composer.lock 还原旧依赖树;镜像 CDN 延迟、项目级 repositories 配置覆盖全局设置、PHP 版本不匹配,这些 clear-cache 一个都解决不了。
- 想升版本:先
rm composer.lock,再composer update或composer install --no-cache(注意不是--no-cache≠clear-cache) - 确认真实生效的镜像:
composer diagnose看Repo packagist.org:行,或composer show -p -vvv | head -1 - 项目级配置优先级高于全局:
composer.json里的"repositories"字段会直接屏蔽config -g设置 - Composer 2.2+ 已弃用
repo.packagist,改用repositories.packagist.org,旧写法配置无效
真正容易被忽略的是:缓存路径可能被环境变量或公司镜像强制重定向,clear-cache 只清它“认为”的那个目录——而你手动进错目录删半天,等于白干。











