
composer global update 真的能“一键更新所有”吗?
不能。它会按 ~/.composer/composer.json 里的版本约束重算依赖,但不会突破你写的 "^4.0" 去装 v5.0,也不会自动跳过已锁定的旧版本——尤其当你用 "4.2.*" 或 "dev-main" 这类宽泛写法时,结果更不可控。
- 它默认读取全局
composer.json,不是项目级的;路径通常为~/.composer/composer.json(Linux/macOS)或%APPDATA%\Composer\composer.json(Windows) - 如果该文件里某个包写的是
"laravel/installer": "4.4.0",composer global update就不会动它,哪怕v5.1.0已发布 - 它不检查命令是否还在
$PATH里——更新完可能laravel --version报command not found,因为新二进制没进环境变量
想安全批量升级,应该先看哪些包真值得升?
别急着 update,先跑 composer global outdated。它不改任何东西,只告诉你哪些包落后了、差几个小版本、最新稳定版是多少。
-
composer global outdated:只查直接安装的包(你手动require的) -
composer global outdated --all:连带查间接依赖(比如phpunit/phpunit拉的sebastian/exporter) - 输出里有
→表示可升,标着(latest: x.y.z)却没箭头,说明当前约束锁死了——得先改composer.json - 很多包其实不该全局装:比如
phpstan/phpstan官方明确说“不要全局安装”,deployer/deployer推荐 PHAR 或项目内require --dev
真正可控的升级操作:用 require 替代 update
全局升级最稳妥的方式,是把 update 当成“重装”,用 composer global require 显式指定版本。它不会牵连其他包,也不会误升你没想动的依赖。
- 查当前版本:
composer global show laravel/installer或直接运行laravel --version - 升到最新兼容版:
composer global require laravel/installer:^5.0 --update-with-dependencies - 降级或回滚:
composer global require phpunit/phpunit:9.6.15(精确版本号) - 如果某包多年没维护、GitHub 上没新 issue、也没在项目中复用,建议直接卸载:
composer global remove vendor/package-name
PATH 和 autoload 是更新后最常失效的两个点
即使 composer global update 或 require 全部成功,你也可能发现命令用不了——不是没装上,而是找不到或加载失败。
- 确认 bin 目录在
$PATH中:echo $PATH | grep -o "$HOME/.composer/vendor/bin",没输出就得补 - 补法(加到
~/.zshrc或~/.bashrc):export PATH="$HOME/.composer/vendor/bin:$PATH",然后source ~/.zshrc - autoload 失效常见于升级后类找不到,可手动刷新:
composer global dump-autoload - 极少数情况要强制忽略平台限制(如 PHP 版本不匹配),可用
--ignore-platform-reqs,但后果自负——它可能装上根本跑不动的二进制










