不会,composer install 仅按 composer.lock 文件精确还原依赖,不扫描或删除 vendor 中未声明的包;所谓“清理”实为 composer remove 等操作更新 lock 文件后引发的重建行为。

composer install 会删 vendor 里非声明包吗
不会。composer install 本身不会主动删除 vendor/ 中任何未在 composer.lock 里列出的包——它只按 lock 文件“还原”依赖树,不扫描、不清理、不校验 vendor 目录是否“干净”。所谓“删了非依赖包”,其实是你之前执行过 composer remove 或手动改过 composer.json,导致 lock 文件已更新,下次 composer install 就照着新 lock 文件重建 vendor,自然把旧包踢出去。
哪些操作会导致 vendor 出现“非依赖包”
这些包不是 composer install 放进去的,而是人为或历史操作残留:
- 手动
cp或git clone进 vendor/(比如临时调试某个 fork) - 用
composer require vendor/package:dev-master安装后又删了composer.json条目,但没运行composer install或composer update - CI 环境中执行过
composer global require,结果全局包被软链接进项目 vendor(极少见,但 Docker 多阶段构建中偶发) - 早期用 Composer 1.x 时手动删 vendor/ 再
composer install,而 lock 文件未同步更新,导致部分包“悬空”存在
为什么删包后 composer install 看起来像“自动清理”
因为 composer install 的行为本质是“按 lock 文件精确还原”,不是“增量同步”。只要 lock 文件里没有某包,它就不会出现在 vendor/ 中。常见误解场景:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 你刚执行
composer remove monolog/monolog→ 它自动删了composer.json条目 + 更新composer.lock+ 运行composer install(Composer 2.2+ 默认行为)→ vendor/ 里 monolog 消失,你以为是install干的,其实是remove触发的后续动作 - 你手动删了
composer.json里的"phpunit/phpunit": "^10",然后直接composer install→ 因为 lock 文件还没更新,vendor/ 不变;只有再跑一次composer update或composer install --no-dev(如果 phpunit 在 require-dev)才会真正移除 -
composer install报错 “Package not found” 却发现 vendor/ 里有同名目录 → 那个目录大概率是手动放进去的,lock 文件里根本没它,install忽略它,也不删它
如何确认 vendor 里有没有“幽灵包”
真正要查的是:哪些包在 vendor/ 里存在,却不在 composer.lock 的 packages 或 packages-dev 区块中。最直接的办法:
运行 composer show --installed,它只列出 lock 文件认可的已安装包;再对比 ls vendor/ 输出,多出来的就是“非依赖包”。注意:composer show 不显示手动放进去的包,也不会报错——它压根不感知它们的存在。
这类包最危险的地方不是占空间,而是 autoload 可能意外加载它们(尤其当它们注册了 PSR-4 映射且没被 dump-autoload 清掉),或者 CI 构建时因权限/路径问题突然失败。别指望 composer install 帮你兜底,它连看都不会多看一眼。










