必须同时删除 vendor/、composer.lock 并执行 composer clear-cache 和 composer install --no-cache,否则仍会复用缓存或旧 lock 文件导致非真正重装。

想让 Composer 真正从头下载所有包,不是“复原”而是“重装”,必须同时切断三个来源:已安装的 vendor/、锁定版本的 composer.lock、以及本地缓存里的 ZIP 包。只做其中一两步,大概率还是在用旧文件。
删 vendor/ 和 composer.lock 是硬性前提
只要 composer.lock 还在,composer install 就只会按它记录的哈希值解压——哪怕你刚删了 vendor/,它也只算“还原”,不触发依赖重解析。而 composer update 会改版本、升级子依赖,不符合“干净重装”的本意。
- Linux/macOS:
rm -rf vendor composer.lock - Windows(PowerShell):
Remove-Item -Recurse -Force vendor, composer.lock - 删之前确认
composer.lock已提交到 Git,否则重生成的 lock 可能和线上环境不一致 - 如果
vendor/删不掉,先关掉 PHP 服务、Xdebug、IDE 文件索引,再试
composer clear-cache 必须执行,且要验证是否清空
Composer 的全局缓存(默认在 ~/.composer/cache/ 或 %APPDATA%\Composer\Cache\)里存着完整的 ZIP 包。不清它,composer install 会直接从缓存解压,连网络请求都不会发。
- 运行
composer clear-cache(不是rm -rf直删目录,Composer 会重建结构) - 验证是否生效:
ls $(composer config --global cache-dir)/downloads/应该为空 - CI/CD 中更保险的做法是设临时缓存目录:
COMPOSER_CACHE_DIR=$(mktemp -d) composer install
composer install --no-cache 才是最终触发重下载的关键
--no-cache 不是“清缓存”,而是告诉 Composer:这次完全不查本地缓存,所有包都走远程下载。它和 clear-cache 是互补关系,缺一不可。
- 不要写成
composer install && composer clear-cache——缓存清理在安装之后,毫无意义 - 如果用的是旧版 Composer(--no-cache 不可用,改用:
COMPOSER_CACHE_DIR=/dev/null composer install - 加
-v参数观察日志:看到大量Downloading https://api.github.com/才算成功;若出现Using cache,说明某步没到位
为什么不用 composer update?
composer update 默认读 composer.json 并升级到符合约束的最新版本,会改 composer.lock、可能拉入不兼容的子依赖。你只是想“重装当前锁住的版本”,不是“升级”。唯一例外是 PHP 平台变更后需先 composer update --lock --no-install 强制重生成 lock,再删 vendor + install。
真正卡住人的地方,从来不是命令记不住,而是删了 vendor/ 却忘了 composer.lock,或清了缓存却没加 --no-cache——结果终端安静如鸡,你以为重装完了,其实只是把硬盘里存了半年的 ZIP 又解了一次。











