Composer没有reinstall命令,重装某包需执行composer remove后composer require,并建议先clear-cache以确保重新下载。

重装某个包,没有 composer reinstall 命令——这是最常被误解的前提。 Composer 本身不提供单包“重装”原语,所谓重装,本质是卸载 + 重新安装,或更新时强制刷新下载。直接跑 composer update vendor/package 很可能什么也不下,因为版本没变、缓存可用、lock 文件锁死。
为什么 composer update package 经常不重装
默认情况下,composer update vendor/package 只在版本约束有变化(比如 ^2.0 → ^2.1)或 lock 文件中记录的 hash 不匹配时才触发下载。如果只是想“把现有版本再拉一遍”,它会跳过网络请求,直接从缓存解压旧 zip。
- 终端看不到
Downloading行,说明根本没走网络 - 检查
vendor/vendor/package下文件修改时间,大概率和上次 install 一致 - 即使你删了
vendor/,只要composer.lock还在,composer install仍复原旧状态,不是重装 -
--force-reinstall参数只在composer update中有效(Composer ≥2.2),且必须配合目标包名使用,单独composer update --force-reinstall会重装全部包
真正生效的单包重装三步法
要确保指定包被彻底重新下载、解压、安装,且不影响其他依赖,推荐这个组合:
- 先卸载:
composer remove vendor/package(自动删vendor/下目录、删composer.json里 require 条目、更新composer.lock) - 再清缓存(可选但强烈建议):
composer clear-cache,否则可能立刻从~/.composer/cache/解压旧归档 - 最后重装:
composer require vendor/package(自动写回composer.json,并按当前约束解析安装)
例如重装 guzzlehttp/guzzle:
composer remove guzzlehttp/guzzle composer clear-cache composer require guzzlehttp/guzzle
如果想装特定版本,直接在 require 后加版本号:composer require guzzlehttp/guzzle:7.8.1。
用 update --force-reinstall 的注意事项
这条命令能跳过缓存、强制重下指定包及其满足约束的最新兼容版本,但它有隐含行为:
- 会连带更新该包的子依赖(除非加
--no-update-with-dependencies,Composer 2.5+) - 如果
composer.json里没显式声明该包,composer update vendor/package会失败,提示 “Package not found in composer.json” - 执行后
composer.lock中对应包的dist.shasum一定会变,但子依赖的版本可能升级——这不是“重装”,而是“升级+重装” - Windows 下若目标包 bin 脚本依赖符号链接(如
phpunit/phpunit),而系统禁用 symlinks,--force-reinstall后可能报错Unable to create symlink
CI/CD 或调试环境必须绕过的两个坑
在 GitHub Actions、GitLab CI 等场景,光靠本地命令不够:
- runner 可能挂载了持久化
COMPOSER_CACHE_DIR,导致composer clear-cache无效;应设COMPOSER_CACHE_DIR=/dev/null或用临时目录 - 某些私有镜像同步滞后,缓存里存的是坏 zip;必须加
--no-cache才强制走网络,但注意:--no-cache对composer update无效,只对install和require生效 - 如果怀疑 lock 文件本身生成时就有问题(比如当时源不可达),不要只删
vendor/,务必连composer.lock一起删,再跑composer install --no-cache,否则仍是复原
真正麻烦的从来不是命令怎么敲,而是你没法一眼看出 Composer 到底是从网络拉的、从缓存解的、还是从 lock 复原的——得看输出、查时间戳、甚至翻 composer.lock 里的 shasum 字段比对。


















