必须同时删除 vendor 和 composer.lock 才能触发重装;仅删 vendor 不删 lock 会还原而非重装,仅删 lock 不删 vendor 则 install 报错。

删 vendor 和 composer.lock 是硬性前提
只要 composer.lock 还在,composer install 就只做“还原”,不是重装。它会严格按 lock 文件里的哈希值从缓存解压,哪怕 vendor/ 是空的,也不会触发网络请求。
- Linux/macOS:
rm -rf vendor composer.lock - Windows(PowerShell):
Remove-Item -Recurse -Force vendor, composer.lock - 删
composer.lock前务必确认已提交到 Git,否则重生成的 lock 可能和线上环境不一致 - 只删
vendor/不删composer.lock→ 白忙一场;只删composer.lock不删vendor/→composer install会报错或拒绝执行
clear-cache 和 --no-cache 必须配对使用
composer clear-cache 清的是 ~/.composer/cache/ 下的 ZIP、元数据等;--no-cache 是告诉 Composer “这次别查本地缓存目录,老老实实发 HTTP 请求”。两者缺一不可——不清理缓存,--no-cache 仍可能命中镜像源返回的旧 ZIP;不清掉 --no-cache,Composer 会在安装时自动重建缓存并复用旧记录。
- 先运行
composer clear-cache,确认输出含Clearing cache (all) - 紧接着执行
composer install --no-cache(或composer require --no-cache vendor/package-name) - CI/CD 中更稳妥:
COMPOSER_CACHE_DIR=/dev/null composer install --no-cache,彻底绕过缓存路径 - 验证是否真重下:终端日志里必须出现
Downloading https://api.github.com/,而非Using cache或Extracting archive
单个包重装别用 update,用 remove + require
composer update vendor/package-name 默认不重下载——它只在版本约束变化或 lock 文件哈希不匹配时才走网络。更常见的情况是直接跳过,甚至可能连带升级子依赖,破坏构建稳定性。
- 先
composer remove vendor/package-name(注意格式是vendor/package-name,不是package-name) - 再
composer clear-cache - 最后
composer require vendor/package-name:^x.y.z(显式指定版本可避免意外升级) - 若该包是
require-dev,加--dev参数:composer require --dev phpunit/phpunit:^10.5 - 别依赖
composer reinstall(2.2+ 支持)——它本质仍是remove + require,且不解决缓存干扰问题
缓存干扰常被忽略:ZIP 文件可能损坏或滞后
你以为在重装,其实只是在解一个上周缓存的 ZIP。杀毒软件扫描、磁盘错误、镜像源同步延迟都可能导致缓存 ZIP 损坏,但 Composer 不会主动校验它——直到 Hash mismatch 或 Invalid zip file 报错才暴露问题。
- 查缓存位置:
composer config --global cache-dir - 精准清理某包缓存:
find $(composer config --global cache-dir) -name "*vendor-package-name*",删匹配的.zip文件 - 清 dist 缓存(不影响 source):
rm -rf $(composer config --global cache-dir)/downloads/* - 强制走 git clone(绕过 ZIP):
composer install --prefer-source
vendor/ 却忘了 composer.lock,或者清了缓存却没加 --no-cache。这两步漏掉任意一个,日志里就看不到 Downloading。











