composer install 不重下载是因为默认复用 composer.lock 和本地缓存;需三步强制刷新:清缓存(composer clear-cache)、删 vendor、加 –no-cache 重装。

composer install 为什么总不重新下载?
因为 composer install 默认完全信任 composer.lock 和本地缓存——只要 vendor 目录存在、lock 文件没变,它就直接解压缓存里的 ZIP,连网络都不碰。哪怕你刚手动删了某个包的文件,它也只补那个目录,不会重拉整个包。
- 缓存路径在
~/.composer/cache(linux/macos)或C:Users用户名AppDataRoamingComposerCache(windows) - 缓存里存的是完整 ZIP 包和元数据,不是“临时文件”,不清掉就会一直被复用
- 只删
vendor/或只跑composer clear-cache都不够:前者仍走缓存,后者不删已安装的旧文件
真正强制刷新的三步组合拳
想让每个包都从远程重新下载、解压、安装,必须同时切断缓存路径 + 清除已安装痕迹 + 强制跳过缓存查找逻辑。
- 先清全局缓存:
composer clear-cache - 再删已安装依赖:
rm -rf vendor(Linux/macOS)或rmdir /s vendor(Windows) - 最后带参数重装:
composer install --no-cache(Composer 2.2+ 推荐)
若版本太老不支持--no-cache,改用COMPOSER_CACHE_DIR=/dev/NULL composer install
注意:--no-cache 不是“清缓存”,而是“这次完全不用缓存”;它和 clear-cache 是互补关系,不是替代关系。
想重装单个包?别用 update,用 remove + require
composer update vendor/package-name 看似合理,但它只更新到符合 composer.json 版本约束的最新版,不保证重下载——尤其当 lock 文件里锁死的是旧版,它可能啥也不干。
- 最稳妥方式:
composer remove vendor/package-name→composer require vendor/package-name - 如果怕升级,加
--with-dependencies:composer update vendor/package-name --with-dependencies,它会严格按 lock 文件重装,不改版本 - Composer 2.2+ 支持
composer reinstall vendor/package-name,但本质仍是 remove + require,无需额外记忆
–refresh 和 –force-reinstall 到底能信吗?
composer update --refresh(2.5+)只刷新元数据,比如重新抓取 packagist 的 packages.json,但 ZIP 还是从缓存读——它解决的是“找不到新版本”,不是“包文件损坏”。
-
composer install --force-reinstall(2.2+)等价于“自动删 vendor 再 install”,但依然走缓存;要彻底重下,必须配--no-cache - CI/CD 中推荐写成:
COMPOSER_CACHE_DIR=/dev/null composer install --no-cache --prefer-dist,避免缓存污染,且--prefer-dist明确走 ZIP 而非 git 克隆,更快更确定
最容易被忽略的一点:很多人清了缓存却忘了删 vendor,或者删了 vendor 却没加 --no-cache,结果还是在用旧缓存解压——三步缺一不可,少一步就不算“强制刷新”。