composer install 不会主动清理 vendor 目录,仅按 composer.lock 增量同步:已存在且哈希匹配的文件(如手动添加的 .git、tests/)原样保留;仅当包源变更(如 source 切 dist 或 commit 更新)时才覆盖重建;真正清理需配合 --no-dev --prefer-dist --remove-vcs、archive.excludes 或 find -exec rm 等显式操作,并同步执行 dump-autoload --classmap-authoritative 和 opcache_reset()。

composer install 不会主动清理 vendor 目录里的任何文件——它只按 composer.lock 增量同步,残留的 .git、tests/、docs/ 等全留着。
为什么 install 不删旧文件?
Composer 的 install 本质是“还原锁文件状态”,不是“重装干净系统”。它只会:
- 下载缺失的包(根据
composer.lock中的 dist/source 信息) - 解压/clone 到
vendor/对应路径 - 跳过已存在且哈希匹配的包(哪怕里面多出一个
.git或tests/)
也就是说:你上次手动往 vendor/monolog/monolog/.git 里塞了个钩子,只要 lock 文件没变,install 就当它不存在,也不管它是否冗余或危险。
哪些残留会被覆盖?哪些会原地保留?
覆盖只发生在“同名包路径被重新写入”时,比如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果
composer.lock里 monolog 的source.reference换了 commit,install会git reset --hard→ 原.git被重置,但目录结构不变 - 如果从 source 切到 dist(或反之),整个
vendor/monolog/monolog/被删后重建 → 原.git彻底消失 - 如果只是版本微调(如 2.10.0 → 2.10.1),且用的是 dist 包 →
install只替换src/和composer.json,tests/和.git若曾被手动放进去,就一直卡在那儿
想让 install “真正干净”,必须提前干预
靠 install 自己做不到,得配合配置或后续动作:
- 在
composer.json的config段加"discard-changes": true→ 下次install会跳过git checkout,直接删掉已有.git目录(仅对 source 模式生效) - 全局设
composer config --global prefer-dist true→ 减少 source 模式触发概率,从源头避开.git - 执行
composer install --no-dev --optimize-autoloader --classmap-authoritative后,再跑find vendor -name ".git" -type d -exec rm -rf {} +→ 手动清,但必须紧接着composer dump-autoload --optimize --classmap-authoritative,否则 autoload 映射可能还指向已删路径
注意:install 本身不执行 dump-autoload,也不刷 OPcache/APCu,这些全得你显式补上。
误删 vendor 后只 run install,会出什么问题?
常见但容易忽略的坑:
- 删了
vendor/但没删composer.lock→install没问题,但若你本地改过某包源码又没提交,这次会彻底覆盖掉 - 删了
vendor/也删了composer.lock→install会生成新 lock,但可能拉到新版(比如 laravel/framework 从 10.45.0 升到 10.46.0),而你没测过兼容性 - 删了
vendor/但没清 Composer 缓存 →install可能复用损坏的 dist 包缓存,解压失败或缺文件
最稳妥的做法是:删 vendor/ + composer clear-cache + composer install --no-dev --no-cache,尤其在 CI/CD 或中文镜像环境下。

















