composer install 不重装已存在包,因其语义是“按 composer.lock 复原”,即使删除 vendor/ 目录,只要 lock 文件存在,就仅从本地缓存解压旧 ZIP,不发网络请求;真正重装需用 composer install --force-reinstall(逐个删包目录→重下载→覆盖→重建 autoload)或组合操作(删 lock + clear-cache + install --no-cache)。

没有 composer reinstall 命令,它根本不存在。所有想“重装依赖”的需求,都得靠 composer install --force-reinstall 或组合操作来达成。
为什么 composer install 不重装已存在的包?
因为它的设计语义就是“按 composer.lock 复原”,不是“重新安装”。哪怕你删了整个 vendor/ 目录,只要 composer.lock 还在,Composer 就只从本地缓存(~/.composer/cache/files/)解压旧 ZIP,甚至不发网络请求。
常见现象包括:
- 终端输出飞快,看不到
Downloading - 文件时间戳没变,
stat vendor/symfony/console显示的仍是上周的修改时间 - 校验失败报
Invalid zip file,说明缓存 ZIP 已损坏但还在被复用
composer install --force-reinstall 到底做了什么?
它不删 vendor/ 根目录、不动 composer.lock,但会逐个处理每个包:删掉 vendor/vendor-name/package-name 子目录 → 从缓存或远程重新下载 ZIP → 解压覆盖 → 重跑 post-install-cmd → 重建 vendor/autoload.php。
适用场景明确:
- CI 构建后
autoload失效(比如生成的classmap没更新) - Windows 下因 PhpStorm 或 Xdebug 占用文件导致 symlink 断裂
- 某些 bin 脚本被手动改过,或权限错乱(如
vendor/bin/phpunit不可执行) - PHP 扩展升级后,部分包的 autoloader 缓存未刷新
注意:--force-reinstall 从 Composer 2.2 开始稳定支持;Composer 1.x 会直接报错 Unrecognized option: --force-reinstall。
怎么真正跳过缓存、强制拉新包?
单靠 --no-cache 不够——它只是跳过缓存读取,但不会删除已安装的包目录,也不会触发重下载逻辑。必须切断三个来源:
- 删掉
composer.lock(否则install仍按旧锁复原) - 运行
composer clear-cache(清空~/.composer/cache/files/下所有 ZIP) - 执行
composer install --no-cache(此时 Composer 会按composer.json重新解析依赖树,并全部走网络下载)
如果只想重装某一个包(比如修复 guzzlehttp/guzzle 的 bin 文件),别用 update,而是:
- 先
composer remove guzzlehttp/guzzle - 再
composer require guzzlehttp/guzzle --with-all-dependencies
这样能避免 update 连带升级其他间接依赖,更可控。
插件重载和依赖冲突绕过要小心
想让某个插件(如 laravel/horizon)强制装上,不是靠 --force 参数——这个参数根本不存在,输错会报 Unrecognized option "--force"。
正确做法是:
- 用
composer require laravel/horizon:5.24.0 --with-all-dependencies,让 Composer 同时调整其传递依赖 - 若仍冲突,临时放宽
composer.json中对应包的版本约束(比如把"monolog/monolog": "^2.8"改成"^2.0 || ^3.0"),再composer update -
--ignore-platform-reqs只跳过 PHP 版本或扩展检查,不影响包间版本兼容性;它不能解决symfony/console v6和laravel/framework v9的硬冲突
最易被忽略的一点:Windows 下普通用户默认无法创建符号链接,composer install 会退化为复制,但某些包(如 phpunit/phpunit)的 bin 脚本依赖 symlinks,后续命令直接报错——这不是 Composer 的 bug,是系统级限制,关 IDE、以管理员身份运行或改用 WSL 才是治本之策。


















