composer global update 不升级所有全局工具,仅更新 ~/.composer/composer.json 中声明的包;该文件常缺失、为空或版本约束过严,导致静默退出、版本不变。

composer global update 不是“一键升级所有工具”的开关,它只更新 ~/.composer/composer.json 里明确声明的包;而这个文件通常不存在、为空,或版本约束过严——所以你执行后静默退出、laravel --version 没变,基本就是这个原因。
为什么 composer global update 经常没反应
它不扫描你装过什么,也不读取 ~/.composer/vendor/ 下实际存在的包。它只认 ~/.composer/composer.json 文件里的内容。常见情况包括:
-
ls ~/.composer/composer.json返回No such file—— 文件根本不存在 - 文件存在但只有一行
"laravel/installer": "^4.0"—— 新版^5.0被锁死,拉不到 -
composer global status报No composer.json found—— 它连入口都找不到
怎么安全地更新一个全局 CLI 工具(比如 laravel/installer)
显式重装比依赖 global update 更可控,也避免依赖冲突。操作顺序不能乱:
- 查当前版本:
laravel --version或composer global show laravel/installer - 查最新稳定版:
composer global show laravel/installer --all | grep latest - 重装指定版本:
composer global require laravel/installer:^5.0 --update-with-dependencies
--update-with-dependencies 很关键:否则主包升了,旧依赖(比如 symfony/console v5)还卡着,运行时报错。
laravel 命令还是 command not found?先检查 PATH 和 bin-dir
安装成功 ≠ 命令可用。composer global require 只把二进制文件放进 ~/.composer/vendor/bin/,系统得知道去哪找它:
- 确认路径是否在
PATH中:echo $PATH | grep -o "$HOME/.composer/vendor/bin"(macOS/Linux) - 没输出?补进 shell 配置:
echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> ~/.zshrc(zsh 用户) - 重载配置:
source ~/.zshrc - 验证生效:
which laravel应输出/home/xxx/.composer/vendor/bin/laravel
composer global list 只说明包注册了,不校验命令是否存在或可执行;which 或直接运行才是真实测试。
要不要批量更新所有全局包?
不建议。全局包来源杂、维护节奏不一、PHP 版本要求和依赖约束常互相打架。比如 phpunit/phpunit v10 要 PHP 8.1+,而你装的 deployer/deployer v7 还锁着 symfony/console ^5.4。真要批量操作,必须先生成基础 composer.json、手动调宽所有版本约束(如改成 "*" 或 "^5.0"),再跑 composer global update——但这一步本身风险就很高。
最常被忽略的点:即使 composer global update 显示“success”,若 ~/.composer/vendor/bin/ 不在 PATH,或者旧二进制文件残留未清理,命令照样失效。别跳过验证这步。











