真正重装Composer包需同步清理vendor、composer.lock并禁用缓存:先删除vendor和composer.lock,再执行composer clear-cache && composer install --no-cache,确保从网络重新下载而非复用缓存或锁文件。

想让 Composer 真正重装包,不是删 vendor 就完事——它大概率会从缓存里解压旧 zip、照着 composer.lock 复原,根本没“重装”,只是“复位”。必须同时控制三件事:锁文件、本地产物、缓存行为。
删 vendor + composer.lock 是重装的前提,不是全部
只删 vendor 目录,composer install 仍会严格按 composer.lock 还原,连哈希校验都跳过;只删 composer.lock 不删 vendor,composer install 会报错或拒绝执行。二者得一起清:
- Linux/macOS:
rm -rf vendor && rm composer.lock - Windows(PowerShell):
Remove-Item -Recurse -Force vendor; Remove-Item composer.lock - 删之前确认
composer.lock已提交或备份——它是重装的唯一版本依据,丢了就得靠composer update --lock重建,那已不是“重装”而是“升级”
composer clear-cache 必须配合 --no-cache 才生效
composer clear-cache 只是清掉 ~/.composer/cache/ 下的归档和元数据,但不阻止后续命令自动重建缓存并复用旧哈希。不加 --no-cache,Composer 在下载前就命中缓存记录,根本不会发 HTTP 请求。
- 正确顺序:
composer clear-cache→ 确认输出含Clearing cache (all)→ 紧接着跑composer install --no-cache -
--no-cache对composer install和composer update都有效,但对composer require同样要显式加上 - CI/CD 中更保险的做法是设环境变量:
COMPOSER_CACHE_DIR=/dev/null composer install --no-cache,彻底绕过缓存路径
用 --force-reinstall 覆盖已有包,但不改 composer.lock
如果你只是想覆盖 vendor 里已存在的文件(比如修复损坏、重跑 post-install-cmd),又不想动 composer.lock 或删目录,composer install --force-reinstall 是最轻量的选择:
- 它强制重解压所有 dist 包、重建 autoload、重新执行安装脚本,但完全不碰
composer.lock内容 - 必须确保
composer.lock是你想要的版本——如果 lock 文件本身已过时,重装出来的仍是旧版 - 搭配
--no-dev可跳过开发依赖;加--with-all-dependencies能覆盖间接依赖(如被其他包引入的子包)
为什么 composer update 不等于重装
composer update 的本质是重新解析 composer.json,它会升级到符合约束的最新版本,可能改写 composer.lock、引入不兼容变更。这不是重装,是升级:
- 运行
composer update monolog/monolog,默认也会更新其子依赖(如psr/log),除非加--no-update-with-dependencies - 想只重装指定包且不升级,得先在
composer.json里写死版本号(如"monolog/monolog": "3.5.0"),再执行composer update monolog/monolog --force-reinstall - 验证是否真重下了:看终端输出有没有
Downloading行,或检查vendor/monolog/monolog目录的修改时间是否更新
真正干净的重装,从来不是单个命令能解决的——它取决于你到底想“覆盖文件”“刷新缓存”还是“重建依赖树”,三者目标不同,操作组合也不同。漏掉任意一环,比如清了缓存却忘了删 lock,或者删了 vendor 却用了 update,结果都是看似重装,实则换汤不换药。











