composer clear-cache 有时不生效,因其仅清理磁盘持久缓存(如 ~/.composer/cache/),而内存缓存、插件私有缓存或沙盒隔离(如 snap)未被触及,需手动删除目录并配合 --no-cache 使用。

直接运行 composer clear-cache 就能清除全局缓存,但实际执行时可能遇到权限、路径或残留文件问题,导致“看似清了,下次 install 还走缓存”。
为什么 composer clear-cache 有时不生效?
Composer 缓存分两层:内存中临时缓存(命令执行期间)和磁盘上持久缓存(~/.composer/cache/)。clear-cache 只清理后者,但若当前终端会话中 Composer 已加载旧缓存元数据,或某些插件绕过缓存检查,就会误判为“没清干净”。
- Linux/macOS 下缓存路径通常是
~/.composer/cache/,但可通过composer config --global cache-dir确认真实路径 - Windows 用户注意:PowerShell 中
~不自动展开,需用完整路径如C:\Users\YourName\AppData\Roaming\Composer\Cache - 如果 Composer 是通过
snap安装(Ubuntu 默认),缓存可能被沙盒隔离,clear-cache无法触达真实位置
手动删除缓存目录更可靠
当 clear-cache 返回 “Clearing cache (cache-dir)” 却无后续提示,或 composer install 仍秒完成,建议跳过命令、直删目录。
- 先查路径:
composer config --global cache-dir
- 再删(Linux/macOS):
rm -rf $(composer config --global cache-dir)
- Windows(CMD):
rmdir /s /q "%APPDATA%\Composer\Cache"
- 删完可立即验证:
ls -la $(composer config --global cache-dir) 2>/dev/null || echo "cache dir gone"
CI/CD 或 Docker 环境要额外清理 vendor/bin
全局缓存清理不影响已安装的全局包(如 phpunit、laravel/installer)的二进制软链,这些链接在 vendor/bin/ 下,但全局安装的包本身缓存在 cache-dir 的 repo/ 和 files/ 子目录。若发现 composer global update 不拉新版,大概率是 cache-dir/repo/ 里还存着旧的包索引 JSON。
- 删缓存后,强制重生成索引:
composer global update --no-cache
- Docker 构建中避免缓存复用:在
RUN指令后加&& composer clear-cache,但更稳妥的是不依赖缓存——用--no-cache参数启动 Composer
真正难处理的是 Composer 插件自建的缓存(比如 hirak/prestissimo 旧版会在 ~/.composer/cache/prestissimo/ 单独存档),这类必须查插件文档手动删;不删它们,clear-cache 命令永远看不见。










