composer global update 经常不更新是因为它只更新 ~/.composer/composer.json 中明确声明的包,而该文件通常不存在、为空或约束过旧;真正可靠的方式是用 outdated 检查、require 显式重装、并确认 PATH 和 bin 目录生效。

composer global update 为什么经常不更新?
它不是“一键升级所有全局工具”的万能命令——composer global update 只会更新 ~/.composer/composer.json 文件里明确声明的包,而绝大多数人从未手动维护过这个文件。你用 composer global require laravel/installer 装完后,包确实进了 ~/.composer/vendor/,但不会自动写进 composer.json。所以运行 composer global update 后没输出、没日志、没变化,大概率是因为:
• ~/.composer/composer.json 根本不存在
• 或者存在但为空/只含旧约束(比如 "laravel/installer": "^4.0"),根本拉不到 v5.x
• 甚至 composer global status 直接报 No composer.json found
真正靠谱的更新方式:显式重装优于盲等 update
别指望 composer global update 自动兜底。更可控、更常见的做法是针对性重装:
- 先查当前版本:
composer global show laravel/installer或直接运行laravel --version - 再指定版本重装(推荐):
composer global require laravel/installer:^5.0 --update-with-dependencies - 想更新全部?先生成基础清单:
composer global show --format=json > ~/.composer/composer.json,然后手动编辑该文件,把每个包的版本号改成宽松约束(如"*"或"^5.0"),最后再跑composer global update
检查有没有可更新的包,用 outdated 而不是硬 update
composer global outdated 才是你日常维护的起点。它不改任何东西,只告诉你哪些包落后了:
- 运行
composer global outdated,有输出就说明存在可更新项;无输出 = 当前已是最新的(在约束范围内) - 加
--all参数可深入检查间接依赖:composer global outdated --all - 看到某行显示
laravel/installer 4.4.0 → 5.1.0,说明可以升;若标着(latest: 5.1.0)却没箭头,通常意味着当前约束锁死了版本
PATH 和 bin-dir 是更新后能否用的关键
即使 composer global update 成功执行了,你也可能遇到 command not found——因为新生成的二进制文件不在 $PATH 里。
- 确认 bin 目录是否在路径中:
echo $PATH | grep -o "$HOME/.composer/vendor/bin",无输出就得补 - 补法(加到
~/.zshrc或~/.bashrc):export PATH="$HOME/.composer/vendor/bin:$PATH",然后source ~/.zshrc - 验证实际二进制是否存在:
ls ~/.composer/vendor/bin/,注意有些包生成的命令名 ≠ 包名(例如phpunit/phpunit生成的是phpunit,不是phpunit.phpunit)
composer global update 当成系统升级按钮;它依赖一个你很可能没管过的 composer.json,且不校验 PATH 是否生效、二进制是否可执行。日常维护,outdated 看差距,require 显式装,PATH 验证到底——这三步比死磕 update 更可靠。










