composer install 不支持单包恢复,因其设计目标是按 composer.lock 全量还原整个依赖树,不接受包名参数或 --only 类选项;删部分 vendor 后执行仍显示“0 installs”,因 Composer 判定目录“已存在”而跳过安装,唯一可靠方式是 composer update monolog/monolog --with-dependencies 或手动清理对应缓存 ZIP 后 composer install --no-cache --force-checksums。

不能用 composer install 恢复单个包 —— 它只认 composer.lock,要么全装,要么不装。
为什么 composer install 不支持单包恢复
composer install 的设计目标是“按锁文件还原整个依赖树”,它不接受包名参数,也不提供 --only 或 -p 之类选项。一旦你删了 vendor/monolog/monolog,但其他包还在,composer install 会跳过已存在目录,不做任何事,也不会校验缺失子目录。
- 错误现象:
Package operations: 0 installs, 0 updates, 0 removals,但vendor/monolog/monolog确实空着 - 根本原因:Composer 认为 vendor 已“部分存在”,直接走增量逻辑,不触发完整解压流程
- 即使加
--no-cache或--force-checksums,也无效——这些参数只影响下载和校验阶段,不改变“是否安装”的判断逻辑
真正能恢复单个包的命令是 composer update 加包名
想只重装 monolog/monolog 及其直系子依赖(比如 psr/log),唯一可靠方式是:
- 运行
composer update monolog/monolog --with-dependencies -
--with-dependencies是关键:否则只会更新该包顶层版本,可能留下不匹配的旧子依赖 - 该操作仍会读取
composer.lock,只升级指定包及其满足约束的子依赖,不会动其他包 - 如果该包在
composer.json中未显式声明(仅作为子依赖存在),需先用composer require monolog/monolog --no-update注册,再update
更轻量的替代方案:手动清理 + 强制重装
比 update 更快、副作用更小的做法是精准清除缓存并触发单包重装:
- 先定位损坏或缺失包的缓存 ZIP:
composer config cache-dir→ 进入files/子目录 → 找monolog/monolog-*.zip - 删掉对应 ZIP:
rm -f ~/.composer/cache/files/monolog/monolog-2.9.2.zip(版本号要对得上composer.lock) - 再执行
composer install --no-cache --force-checksums:此时因缓存缺失,Composer 会重新下载并解压该包,其他包走缓存,实际效果接近“单包恢复” - Windows 用户注意:PowerShell 中路径要用
$env:APPDATA\Composer\Cache\Files\...,且通配符*需用Get-ChildItem配合Remove-Item
最易被忽略的一点:别指望 composer install 做局部修复。它的原子性单位是整个 vendor/ 目录,不是单个包。真要精确控制,必须切换到 update 或手动干预缓存。


















