删 vendor 目录并清空 composer.lock 后运行 composer install 才是真正的强制重装;因为 install 会生成全新 lock 文件并从头下载所有包,而 update 受旧 lock 约束,无法降级、换源或改变 dist/source 方式,且可能复用缓存、忽略 platform 检查。

直接删 vendor 目录 + 清空 composer.lock 再运行 composer install,才是真正的“强制重新安装”——仅用 composer update 无法保证完全重装,尤其当锁文件存在时。
为什么 composer update 不等于重装
它只更新 composer.json 中允许的版本范围,且受 composer.lock 约束:已锁定的包不会降级或换源,连 dist 和 source 下载方式都不会变。常见现象包括:
- 明明换了镜像源,但某些包仍从 packagist.org 下载(因为 lock 文件里记着旧 URL)
- 执行
composer update --with-all-dependencies后,vendor/autoload.php的类加载顺序或符号链接行为没变化 - 本地修改过某依赖的代码(如调试打 patch),
update后被原版覆盖,但你根本没意识到
删 vendor + 清 composer.lock 后该用 install 还是 update
必须用 composer install:
-
install会严格按composer.lock(如果存在)还原依赖;而你刚删了它,所以 Composer 会重新生成一份全新的 lock 文件,并从头下载所有包 -
update在无 lock 文件时虽也会生成新 lock,但它会尝试复用本地已有的包缓存(~/.composer/cache),可能跳过校验、忽略platform-check或绕过preferred-install配置 - 若项目有
platform配置(如"platform": {"php": "8.2.10"}),只有install会强制检查并报错,update可能静默降级兼容版本
实操命令与关键细节
执行前确认已备份自定义修改(如 vendor/xxx/patched-file.php):
-
rm -rf vendor composer.lock(Linux/macOS)或rmdir /s vendor && del composer.lock(Windows) - 确保
composer.json中的require和require-dev是你想要的最终状态——此时没有 lock 文件兜底,任何 typo 都会导致安装失败 - 运行
composer install --no-dev(如需跳过 dev 依赖)或composer install --optimize-autoloader(生产环境建议) - 如果遇到
Package x requires y but y is locked to z类错误,说明composer.json和残留缓存冲突,加--ignore-platform-reqs仅作临时排查,不要长期使用
容易被忽略的副作用
重装后 vendor/bin 下的二进制文件(如 phpunit、laravel)路径可能变化,IDE(如 PHPStorm)的外部工具配置、Shell 的 $PATH 缓存需手动刷新;composer dump-autoload -o 必须重跑,否则类加载器仍指向旧的 vendor/composer/autoload_*.php 文件。










