composer outdated 是唯一靠谱的检查入口,它直接比对 composer.lock 与 Packagist 上满足版本约束的最新稳定版,精准反映真实可升级空间,默认仅显示兼容更新,加 --all 可查看全部状态,含安全标签需 Composer 2.2+。

composer outdated 是唯一靠谱的检查入口
它不是“能用”,而是“必须用”——所有其他命令(比如 composer show、composer check-updates)要么过时,要么是第三方插件,要么根本不存在(比如拼错成 composer outpdated)。composer outdated 直接比对 composer.lock 里锁死的版本和 Packagist 上当前满足你 composer.json 版本约束的最新稳定版,结果最贴近真实可升级空间。
- 默认只显示「有新版本且兼容当前约束」的包,比如你写的是
"monolog/monolog": "^2.0",它就只列到2.x范围内的最新版(如2.10.0),不会报3.0.0 - 加
--all才会强制列出全部已安装包,并标注哪些被约束卡死了(比如明明有3.0.0,但你的^2.0不允许升)、哪些已是最新、哪些连源都换成了 fork - 如果输出里某行带
[security]标签,说明这个更新含已知安全修复——这要求你用的是 Composer 2.2+,且 Packagist 数据已同步
别信“强制更新”,先搞清你到底想绕过什么
没有 composer force-update 这种命令。所谓“强制”,其实是针对不同卡点的手动干预,每种都有明确副作用:
-
composer update --no-cache:跳过本地缓存,直连 Packagist API,确保看到的版本列表是实时的;适合你刚听说某包发了补丁,但outdated没刷出来 -
rm composer.lock && composer install:彻底丢掉锁文件,让 Composer 重新解析全部依赖树并选最新兼容组合——风险极高,可能拉进一堆不兼容的次级依赖 -
composer update vendor/package --with-all-dependencies:只升指定包,但连带把它所有子依赖也升到最新兼容版;比全量 update 安全,但依然可能触发 BC break -
--ignore-platform-reqs:绕过 PHP 版本、扩展等检查;仅用于调试,上线前必须撤掉,否则部署失败
安全更新和小版本更新要分开盯
一个包同时有安全修复和功能迭代,outdated 默认全混在一起列,但你的升级策略得拆开:
- 查纯安全更新:用
composer outdated --security-only(Composer 2.2+),它只过滤出已确认存在 CVE 并已有修复版本的包 - 只想做保守升级(避免 breaking change):用
composer outdated --minor-only或--patch-only;注意旧版 Composer 不支持这些参数,运行前先composer --version确认 - CI 中建议组合使用:
composer outdated --direct --minor-only --no-dev+composer update --dry-run --with-dependencies;前者聚焦你管的包,后者验证实际升级会不会崩依赖树
别忽略私有源和 fork 的“假阴性”
composer outdated 默认只查 Packagist,如果你的项目用了私有仓库(比如 GitLab 私服)、或某个包被 fork 后改了 composer.json 的 source 地址,那它完全感知不到那些源里的新 tag 或 commit。
- 现象:
outdated显示myorg/logger“up to date”,但你去私有 Git 仓库一看,早就打了v1.2.5tag - 验证方式:先
composer show myorg/logger看source类型;如果是git,再用git -C vendor/myorg/logger log --oneline HEAD...origin/main直接比对本地和远程分支差异 - 更通用的解法:在 CI 脚本里,对私有包单独调 GitHub/GitLab API 查
/repos/{owner}/{repo}/releases,再和本地installed.json里的 version 字段比对
真正难的从来不是“怎么查”,而是查出来之后,怎么判断那个 v3.0.0 是该立刻上,还是该先读完 CHANGELOG 再压一周观察;还有就是,当 outdated 说没更新,而你心里清楚某 bug 已被修掉——那大概率是它根本不在 Packagist 主源里。










