composer install 不会重新下载已存在的包,因为它严格依据 composer.lock 中的版本和哈希值还原依赖,仅当 vendor/ 下对应包目录缺失时才触发下载与解压。

composer install 为什么不会重新下载已存在的包
因为 composer install 默认只按 composer.lock 中记录的精确版本和哈希值还原依赖,只要 vendor/ 目录里对应包的文件完整、composer.lock 没变,它就跳过下载和解压——哪怕你本地的包文件已被意外修改或损坏。
用 composer update --force-with-dependencies 不够精准
这个命令会强制更新整个依赖树(包括子依赖),容易引发意料外的版本升级或冲突。真正想“只重装某几个包”,不该走 update 流程。
- 它不保证重装时使用与
lock完全一致的 dist ZIP 哈希,尤其当 packagist 上该版本的归档被重新发布过 - 如果包有
post-install-cmd或post-update-cmd脚本,会被重复执行,可能造成副作用(如重复生成缓存、覆盖配置) - 无法单独指定重装
monolog/monolog而不动psr/log
最可靠的方式:删 vendor 子目录 + composer install --no-dev(可选)
Composer 本身没有 “reinstall package X” 命令,但它的行为是确定性的:只要 vendor/ 下对应路径不存在,且 composer.lock 未变,composer install 就会原样拉取并解压那个包。
- 删除目标包目录:
rm -rf vendor/vendor-name/package-name(Linux/macOS)或rmdir /s vendor\vendor-name\package-name(Windows) - 运行
composer install --no-dev(如果你不需要 dev 依赖,能略提速;否则直接composer install) - 确认
composer.lock未被意外修改——否则会触发 update 行为而非 reinstall - 注意:某些包含自定义安装器(如
composer-plugin),删目录后需确保其install钩子仍能正常触发
遇到 “package not found” 或哈希校验失败怎么办
说明本地 lock 文件记录的 dist URL 已失效,或 ZIP 内容哈希与 lock 不符。这不是重装问题,而是源一致性问题。
- 先运行
composer clear-cache清掉可能损坏的本地缓存 ZIP - 检查
composer.lock中对应包的dist.shasum字段是否为空或明显异常(比如长度不是 64 位) - 若怀疑 lock 被篡改,用
git checkout -- composer.lock恢复原始版本再试 - 极端情况可临时加
--ignore-platform-reqs绕过平台检查,但不要提交改动后的 lock
重装的本质是让 Composer 回到“缺失状态”再走一遍标准安装流程。别试图用 update 替代 install,也别依赖所谓“隐藏参数”——删目录 + install 是目前唯一稳定可控的做法。


















