composer show -D --outdated 是检测全局已安装包更新状态的原生命令,仅显示显式安装的包及其可升级版本,需 Composer 2.2+ 支持,配合 JSON 解析可高亮输出,但不可盲目 global update。

composer global outdated 会报错说找不到命令
这是因为 composer global 子命令里压根没有 outdated——它只支持 install、update、remove 和 list。想查全局包更新状态,得绕道走。
实际做法是:进入全局 vendor 目录,用普通 composer outdated 命令扫描。默认路径是:
- Linux/macOS:
~/.composer/vendor/ - Windows:
%APPDATA%\Composer\vendor\
执行前先确认路径是否正确,可用 composer global config home 查看 Composer 全局配置根目录,再拼出 vendor 路径。
为什么直接 cd ~/.composer/vendor && composer outdated 还是报错?
因为 ~/.composer/vendor/ 下没有 composer.json,而 composer outdated 必须在有该文件的目录里运行。全局安装的包信息其实存在 ~/.composer/composer.json 里,但这个文件不直接对应 vendor 结构,不能直接用。
可靠解法是用 composer global list --format=json 提取已装包名和版本,再逐个调用 Packagist API 或本地 composer show -l 检查。但更轻量的做法是:
- 临时生成一个带依赖的
composer.json:composer global dump-autoload不行,得手动建 - 推荐用现成小脚本:进入
~/.composer后运行composer create-project --no-install --repository-url=https://packagist.org/ --no-interaction --prefer-dist --quiet .(不推荐) - 真正实用的是这条命令:
composer show -D --outdated—— 注意是-D(即--direct),它会列出所有「直接声明」的全局包及其可升级版本
composer show -D --outdated 是目前最接近“自动检测”的原生命令,但它只显示你通过 composer global require 显式安装的包,不包括其依赖的依赖。
如何批量检查并高亮有更新的包?
单纯靠 composer show -D --outdated 输出不够直观,尤其包多时容易漏看。可以加一层过滤:
- Linux/macOS:用
composer show -D --outdated | grep -E "^[a-z0-9\-]+/[a-z0-9\-]+ +[0-9]"提取有效行 - 更稳的方式是解析 JSON:
composer show -D --outdated --format=json | jq -r '.[] | select(.latest != .version) | "\(.name) \(.version) → \(.latest)"'(需装jq) - Windows PowerShell:用
composer show -D --outdated --format=json | ConvertFrom-Json | ? { $_.latest -ne $_.version } | % { "$($_.name) $($_.version) → $($_.latest)" }
注意:composer show -D --outdated 在 Composer 2.2+ 才稳定支持;旧版可能返回空或报错,建议先运行 composer --version 确认。
自动更新全局包的风险在哪?
别看到 “outdated” 就 composer global update 一通狂按。问题在于:
- 全局包常被 CLI 工具链强依赖(比如
laravel/installer、phpunit/phpunit),版本跳变可能破坏脚本兼容性 -
composer global update会升级所有包(含传递依赖),不是只升显式安装的那些 - 没锁版本号(
composer.json中无"minimum-stability": "stable"或"prefer-stable": true)时,可能装上 RC 或 dev 版本 - 某些包(如
hirak/prestissimo)已废弃,更新后反而失效
真正安全的做法是:只对明确需要的包单独更新,例如 composer global require laravel/installer:^4.0,而不是全量更新。
全局包更新不像项目依赖那么可控,少动比多动更稳妥。如果真要自动化检测,建议把 composer show -D --outdated 加进每日 cron,并人工判断是否值得更新。


















