必须同步清理三处:~/.composer/cache/repo/https---packagist.org/(元数据)、vendor/composer/installed.json(本地快照)、composer.lock(版本锁),否则composer update仍基于旧状态执行,无法拉取新版本。

删 composer.lock 本身不解决“缓存导致的问题”,它只是触发重建的开关;真正卡住 composer install 或 composer update 的,是 vendor/、installed.json 和元数据缓存三者的残留状态。
为什么只删 composer.lock 还是装不到新版本
Composer 在无 composer.lock 时的行为,取决于本地有没有 vendor/ 目录和缓存里的元数据:
- 有
vendor/→ 它可能跳过下载,只尝试重建 autoload,但若包结构已变(如类路径迁移),直接报Class not found - 有
~/.composer/cache/repo/https---packagist.org/→ 即使删了 lock,它仍按旧packages.json解析依赖,根本看不到新发布的 v3.0.0 - 有
vendor/composer/installed.json→composer show、composer outdated全部基于这个快照,会误判“当前已是最新”
部署/CI 场景下必须同步清理的三处位置
顺序不能颠倒,否则 composer update 会读着旧元数据生成新 lock,白清:
- 先运行
composer clear-cache:清掉cache/files/(zip 包)和cache/vcs/(git 克隆),避免干扰 - 再删元数据:
rm -rf $(composer config --global cache-dir)/repo/https---packagist.org/(Linux/macOS)或Remove-Item -Recurse -Force "$env:APPDATA\Composer\Cache\repo\https---packagist.org\"(PowerShell) - 删本地快照:
rm -f vendor/composer/installed.json - 最后删锁文件:
rm -f composer.lock
Windows 上删不掉 vendor/ 或缓存目录怎么办
报 Could not delete 几乎从不是权限问题,而是进程占用了文件句柄:
- PHP 进程(
php artisan serve、sail、Swoole)正在加载vendor/下的类 - IDE(PhpStorm / VS Code)后台索引服务锁住了整个目录
- Windows Defender 或杀毒软件正在扫描刚解压的 zip 文件
正确操作顺序是:先停 PHP 服务,再关 IDE,最后删。手动删失败时,用 PowerShell 执行:Remove-Item -Recurse -Force vendor\some-package 比硬删整个 vendor/ 更稳妥。
composer clear-cache 清不干净的常见原因
它只删当前用户有写权限的子目录。如果之前用 sudo composer install 写过缓存,部分文件属主变成 root,普通用户执行 clear-cache 就会静默跳过:
- 验证命令:
ls -ld $(composer config --global cache-dir) - 修复命令:
sudo chown -R $USER:$USER $(composer config --global cache-dir) - 环境变量未生效也会导致“清了等于没清”:确认
COMPOSER_CACHE_DIR已导出(export COMPOSER_CACHE_DIR=...),否则clear-cache实际作用在空路径
最易被忽略的一点:缓存目录被多个 CI Job 共享时,clear-cache 可能因竞态失败。必须为每个 Job 隔离缓存路径,比如设置 COMPOSER_CACHE_DIR="${WORKSPACE}/.composer-cache"。











