是,composer update --no-cache 会禁用本次执行的所有缓存(files/repo/vcs),强制重新拉取远程资源,但不清理缓存目录、不触发垃圾回收,也不影响依赖解析过程。

composer update --no-cache 会禁用所有缓存吗
会,但仅限本次命令执行过程。加 --no-cache 后,Composer 不会读取 cache-dir/files 中的已下载包、不复用 cache-dir/repo 里的元数据、也不查 cache-dir/vcs 的 Git 仓库克隆副本——所有资源都重新从远程拉取。
注意:它不影响缓存目录本身的存在或内容,也不会触发垃圾回收;只是绕过缓存路径,不写入新缓存(除非其他参数显式要求)。
-
--no-cache对composer update和composer install都有效,但对composer require无效(require 内部调用的是 update) - 如果同时用了
--prefer-dist,仍会下载 zip 包,但不会查本地缓存的同名 zip 文件 - 若网络不可达或镜像源异常,
--no-cache会让命令直接失败,而不是 fallback 到旧缓存
为什么有时加了 --no-cache 还卡在 Resolving dependencies
因为 --no-cache 只禁用「资源获取层」缓存,不跳过「依赖解析层」的 SAT 求解。当 composer.json 存在隐式冲突(比如两个包分别 require 不兼容的 psr/log 版本),Composer 仍会在本地穷举版本组合,和缓存无关。
此时真正有效的不是禁用缓存,而是定位阻断点:
- 先跑
composer why-not psr/log:^3.0查谁在挡路 - 或加
-v看日志停在哪一行约束上 - 临时删掉
conflict或放宽某个require范围再试
生产环境千万别用 composer update --no-cache
它仍然会重算整个依赖图、改写 composer.lock、并可能升级到未经测试的版本——这和是否走缓存完全无关。生产环境只该跑 composer install --no-dev --optimize-autoloader,且必须确保 composer.lock 已提交、未被忽略。
如果你是为了“强制刷新”而想用 --no-cache,说明部署流程有漏洞:vendor 应该由 CI 构建好后打包下发,而不是在生产机上现场执行任何 update 类命令。
替代方案:彻底清空再装,比 --no-cache 更可控
当怀疑缓存损坏(如反复报 zlib_decode() error 或 corrupted archive),单靠 --no-cache 不够。要真正重来,得切断所有残留路径:
- 删掉
vendor/目录(rm -rf vendor或rmdir /s vendor) - 运行
composer clear-cache - 确认缓存目录下
files/和downloads/为空(有时权限问题会导致 clear-cache 失败) - 再执行
composer install --no-cache --prefer-dist --no-dev --optimize-autoloader
这个组合才真正实现“从零开始”,也最容易排查是网络、配置还是约束本身的问题。











