composer install 不重装包是因为它严格遵循 composer.lock 文件,即使 vendor 被删除也按锁文件版本安装;强制重装需删 lock 文件、刷新 lock 或清缓存配合删 vendor。

composer install 为什么没重新下载包
因为 composer install 默认只读取 composer.lock 文件,只要锁文件存在且没变,它就直接解压已有的 vendor 包,完全跳过远程仓库。哪怕你删了 vendor/ 目录,只要 composer.lock 还在,它依然按老版本装——这不是 bug,是设计行为。
强制重装所有包的三种可靠方式
核心逻辑:绕过 lock 文件约束,或让它失效。
-
rm -rf vendor/ composer.lock && composer install:最彻底,删锁文件+删包目录,从头生成新 lock 并安装。适合想全面升级又不怕兼容风险的场景 -
composer update --lock:不改composer.json也能刷新 lock 文件(比如远程包有 patch 版本更新但未 bump minor),再跑composer install就会拉新包 -
composer install --no-cache:仅禁用本地缓存,不影响 lock 行为;真正起效需配合composer clear-cache+ 删除vendor/,否则还是走 lock
composer update 和 install 的关键区别
composer update 会根据 composer.json 重新解析依赖树、写入新 composer.lock,并安装对应版本;composer install 只认 composer.lock,不看 composer.json 的版本范围变动。所以:
- 团队协作中,
composer install是标准部署命令,确保环境一致 -
composer update应该只在明确要升级依赖时使用,尤其注意dev-master或宽松版本号(如^2.0)可能引入不兼容变更 - 想局部更新?用
composer update vendor/package-name,避免全量重算
容易被忽略的缓存和权限陷阱
即使清了 vendor 和 composer.lock,仍可能装旧包——Composer 默认启用本地 ZIP 缓存,且某些系统(如 Docker 容器内)的 ~/.composer/cache 权限可能让新进程读不到最新缓存索引。
- 确认缓存状态:
composer clear-cache后执行composer config --global cache-dir查路径,手动ls -l看是否真清空 - Docker 构建中,建议在
RUN阶段加&& composer clear-cache,避免复用构建缓存导致包未更新 - 若用
git clone替代composer install拉包(如私有包),记得检查composer.json里是否写了"type": "package"或自定义repositories,这类配置不会被install自动刷新
git status 看一眼 composer.lock 是否被意外修改,否则强制重装后提交的 lock 文件可能和队友不一致。










