Composer默认优先使用本地缓存,强制重装需先clear-cache再加--no-cache参数;--refresh仅更新元数据不重下dist包;CI/CD中应设COMPOSER_CACHE_DIR=/dev/null并用--prefer-dist。

Composer 不会自动忽略缓存重装包,除非你明确告诉它“别用缓存”——composer install 和 composer update 默认都优先走本地缓存(~/.composer/cache),哪怕 composer.lock 没变、哪怕包内容在远程已被覆盖或篡改。
强制清空缓存再安装:两步缺一不可
只删缓存或只加参数都不够稳定。真实生效的组合是:
- 先运行
composer clear-cache—— 清掉~/.composer/cache/files/和~/.composer/cache/repo/下所有已下载的 zip、dist 包和元数据 - 再用
composer install --no-cache或composer update --no-cache—— 这个--no-cache参数会跳过缓存查找逻辑,直接走远程 HTTP 下载
注意:--no-cache 对 composer install 有效,但某些旧版本(如 1.x)可能不识别该参数,此时必须升级到 2.2+ 或改用 COMPOSER_CACHE_DIR=/dev/null composer install。
为什么 composer update --refresh 不行?
--refresh 是 Composer 2.5+ 新增的参数,但它只刷新包的元数据(比如 packages.json),并不强制重下 dist 包。现象是:版本号没变、composer.lock 不动,但实际 zip 文件仍从缓存读取。它解决的是“元数据过期”,不是“包文件过期”。
如果你怀疑某个包的 dist 文件被恶意替换(例如私有 repo 覆盖了 tag),必须配合 --no-cache 或手动删缓存目录。
CI/CD 中更可靠的写法
在 GitHub Actions、GitLab CI 等无状态环境里,缓存本就不该存在。推荐显式禁用:
COMPOSER_CACHE_DIR=/dev/null composer install --no-interaction --prefer-dist
关键点:
-
COMPOSER_CACHE_DIR=/dev/null让 Composer 把缓存写入空设备,避免意外命中 -
--prefer-dist确保走 zip 下载而非git clone(后者不受--no-cache影响) - 不要依赖
composer install --ignore-platform-reqs来绕过缓存——它和缓存无关
最易被忽略的一点:私有仓库配置里的 packagist.org 镜像(如阿里云镜像)本身也有 CDN 缓存,即使 Composer 本地缓存清空,仍可能拉到镜像节点上滞留的老包。这时需要联系镜像方刷新,或临时切回官方源:composer config -g repo.packagist composer https://packagist.org。










