
composer global update 经常不更新是因为它只更新 ~/.composer/composer.json 中明确声明的包,而该文件通常不存在、为空或约束过旧;真正可靠的方式是用 outdated 检查、require 显式重装、并确认 PATH 和 bin 目录生效。
它不是“一键升级所有全局工具”的万能命令——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
别指望 composer global update 自动兜底。更可控、更常见的做法是针对性重装:
composer global show laravel/inst
aller 或直接运行 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
composer global outdated 才是你日常维护的起点。它不改任何东西,只告诉你哪些包落后了:
composer global outdated,有输出就说明存在可更新项;无输出 = 当前已是最新的(在约束范围内)--all 参数可深入检查间接依赖:composer global outdated --all
laravel/installer 4.4.0 → 5.1.0,说明可以升;若标着 (latest: 5.1.0) 却没箭头,通常意味着当前约束锁死了版本即使 composer global update 成功执行了,你也可能遇到 command not found——因为新生成的二进制文件不在 $PATH 里。
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 更可靠。