composer outdated 默认仅显示满足版本约束且 latest 高于 installed 的包,不显示锁定版本、dev 分支、replace/provide 覆盖包、platform 扩展及 lock 新于 json 的情况;常用组合有 --direct --minor-only、--all、--format=json 等。

composer outdated 是检查项目中过期依赖最直接的方式,它默认只显示有新版可用的包(不包括已锁定版本或 dev 分支),不是所有包都会列出来——这点容易误以为“没包可更新”。
怎么看哪些包有更新?
运行 composer outdated 后,默认输出三列:name、latest、installed。只有当 latest 版本号高于 installed 且满足当前 composer.json 中的版本约束时,才会显示。
- 如果某包显示为
dev-main或dev-develop,它通常不会被标记为“outdated”,因为 Composer 默认不比较开发分支 - 加
--direct只看composer.json显式声明的包,排除递归依赖 - 加
--minor-only或--patch-only可限制只显示兼容的次要/补丁更新
为什么有些包明明有新版却不显示?
常见原因包括:
-
composer.json中该包版本写死了,比如"monolog/monolog": "2.8.0",即使 2.9.0 已发布,也不算“outdated”——因为不满足语义化版本范围 - 该包被
replace或provide规则覆盖,Composer 认为其功能已被替代 - 使用了
platform配置(如"ext-gd": "*"),这类虚拟扩展不会出现在outdated列表中 - 本地
composer.lock比composer.json新,但outdated依据的是lock文件中的已安装版本
如何让结果更实用?
日常排查建议组合使用这些参数:
-
composer outdated --direct --minor-only:聚焦主依赖的稳妥升级项 -
composer outdated --all:强制列出全部依赖(含子依赖),但信息量大,需配合grep筛选 -
composer outdated --format=json:输出 JSON,适合脚本解析或 CI 中做自动告警
composer outdated --direct --format=json | jq -r '.[] | select(.latest != .installed) | "\(.name) \(.installed) → \(.latest)"'
注意 lock 文件和 require 的关系
composer outdated 的判断基础是 composer.lock,不是 composer.json。如果你刚改了 require 但还没 install 或 update,outdated 不会反映新声明的版本约束。想验证新 require 是否能拉到更新版,得先 composer update xxx 或至少 composer install --dry-run 看是否冲突。










