Composer update默认复用缓存是设计使然:优先使用~/.composer/cache/files/中的ZIP包和vendor/composer/installed.json,跳过远程检查;彻底跳过需组合rm -rf vendor、composer clear-cache、--no-cache与--prefer-source。

Composer update为什么总是走缓存
默认情况下,composer update 会复用已下载的包压缩包(vendor/composer/installed.json 和 ~/.composer/cache/ 下的 zip 文件),尤其在 lock 文件没变、依赖范围未调整时,它甚至可能跳过远程检查。这不是 bug,是设计使然——但当你刚发布新 tag、修复了 packagist 同步延迟、或本地改了私有 repo 的代码却没生效时,这就会变成阻碍。
--no-cache 参数不能跳过所有缓存
--no-cache 只禁用 Composer 自己的 HTTP 缓存(比如对 packagist.org 的 API 响应缓存),但它不清理已下载的包归档文件,也不强制重新解析依赖图。所以你执行 composer update --no-cache 后,仍可能看到 Using version ^2.1 for vendor/package 然后直接解压旧 zip。
- 真正需要的是「丢掉所有已下载的包快照」+「强制重走完整安装流程」
-
--no-cache对私有 Git repo 的 shallow clone 缓存也无效 - 如果你用的是
composer install,那--no-cache几乎没用——它本来就不走远程解析
彻底跳过缓存的实操组合
要让 composer update 完全无视本地已有资源,按以下顺序操作:
- 删掉
vendor/目录:rm -rf vendor/(否则update可能复用部分已安装包) - 清空 Composer 全局缓存:
composer clear-cache(它会告诉你清了多少 MB) - 加
--no-cache+--prefer-source(后者强制从 Git clone 而非下载 zip,避开归档缓存) - 必要时加
--ignore-platform-reqs避免因 PHP 扩展缺失中断,但这和缓存无关
最终命令示例:
rm -rf vendor/ && composer clear-cache && composer update --no-cache --prefer-source
私有 Git repo 场景下的额外注意点
如果你的 composer.json 引用了 Git 仓库(如 "type": "vcs" 或 SSH URL),即使清了缓存,Composer 默认仍会对每个 repo 做 shallow clone 并复用本地 ~/.composer/cache/vcs/ 下的镜像。这时必须配合 --prefer-source,且确保 Git 仓库的 commit 已推送——否则 update 会拉到旧 commit。
- 检查是否真推上去了:
git ls-remote origin HEAD对比本地git rev-parse HEAD - 如果用 GitHub/GitLab,确认 Webhook 已触发 packagist 同步(或手动点击 “Update”)
-
composer config --global repositories.packagist.org.allow_ssl_downgrade true这类配置不会影响缓存逻辑,别混淆
缓存不是黑盒,它是分层的:HTTP 响应、zip 包、Git 镜像、vendor 解包结果。跳过哪一层,得对应动哪一把钥匙。漏掉 vendor/ 或忘了 --prefer-source,就容易以为“缓存没清干净”,其实是流程没走全。


















