composer global update不是升级全局工具的正确命令,它因依赖~/.composer/composer.json(常不存在或约束过严)而静默失败;应显式执行composer global require vendor/package:^x.y --update-with-dependencies重装指定版本,并确保~/.composer/vendor/bin在$PATH中。

composer global update 不是升级全局工具的正确命令,它几乎总是静默失败——真正有效的做法是显式重装指定版本。
为什么 composer global update 总是没反应
它只读取 ~/.composer/composer.json 里的版本约束来决定更新范围,而这个文件:
- 90% 情况下根本不存在(
ls ~/.composer/composer.json返回 “No such file”) - 若存在,内容常是过时且过严的写法,比如
"laravel/installer": "^4.0",根本拉不到 v5.x - 不会自动发现你已装过哪些包,也不会“智能推断最新版”
现象就是命令执行后无输出、laravel --version 仍是旧版,你以为卡住了,其实是它压根没干任何事。
安全升级单个全局 CLI 工具的实操步骤
以升级 laravel/installer 为例,按顺序执行:
- 查当前装了什么:
composer global show laravel/installer - 看所有可用版本(含 latest 标记):
composer global show laravel/installer --all - 显式重装目标版本:
composer global require laravel/installer:^5.0 --update-with-dependencies
--update-with-dependencies 是关键:不加它,可能只升主包,留下冲突的旧依赖(比如新 laravel/installer 要 symfony/console ^6.0,但旧 phpunit 还锁着 ^5.4)。
升级后命令还是 command not found
不是安装失败,是系统找不到二进制文件。原因和修复:
- 确认
~/.composer/vendor/bin是否在$PATH中:echo $PATH | grep -o "$HOME/.composer/vendor/bin" - 若无输出,追加到 shell 配置(如
~/.zshrc):export PATH="$HOME/.composer/vendor/bin:$PATH" - 重载配置:
source ~/.zshrc - 验证是否生效:
which laravel应输出/home/xxx/.composer/vendor/bin/laravel
composer global list 只显示注册名,不校验文件是否存在或可执行——不能代替 which 或直接运行测试。
别碰批量更新,尤其别信 global update 能修插件
全局包来源杂、依赖节奏不一,强行批量更新大概率引发冲突。更危险的是:
- Composer 2.5+ 默认启用 plugin API v2.0,而很多旧插件(如已废弃的
hirak/prestissimo)根本不适配 -
composer global update不会跳过坏插件,反而会让它们更新得更彻底,导致后续composer install卡在Package operations: 0 installs, 0 updates - 真遇到插件问题,应先
composer install -n测试;再删composer.json里的"plugins"字段,或运行composer config --global --unset plugins
最易被忽略的一点:升级后 composer config -g repo.packagist 很可能变空或回退到 https://packagist.org,必须手动补设国内镜像源才能让后续 update 和 require 快起来。


















