composer outdated 仅比对 composer.lock 与 packagist 稳定版,不校验 composer.json 约束、依赖图或安全漏洞,显示可升版本未必真能升级,需结合 --dry-run、--security-only 等参数及 changelog 综合判断。

composer outdated 不是“过期扫描器”,它只比对 composer.lock 里记录的版本和 Packagist 上当前稳定分支的最新版,不校验 composer.json 的约束、不解析依赖图、也不查安全漏洞。看到列表就升级,大概率出问题。
为什么 composer outdated 显示的包不一定能升
它完全忽略你 composer.json 里的版本写法。比如你写了 "monolog/monolog": "^2.0",锁着 2.10.0,而 Packagist 已发 3.5.0——outdated 会照常标出 2.10.0 → 3.5.0,但 composer update 根本不会装,因为 3.5.0 不在 ^2.0 范围内。
- 加
--direct只看你自己手动 require 的包,避免被几十个间接依赖刷屏 - 加
--minor-only或--patch-only可过滤掉主版本跳变(但别迷信:不是所有包都守 SemVer) - 如果输出里有
[dev-main]或[dev-develop],说明这个“更新”来自 Git 分支,不是 tagged release,outdated默认不比对这类引用
composer outdated 和 composer update --dry-run 的本质区别
前者是快照比对,后者是完整模拟升级流程。想确认“升了会不会崩”,必须用后者。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
outdated不知道你的 PHP 版本是否支持新包,update --dry-run会报Your requirements could not be resolved如果平台不满足 -
outdated不检查 conflict 规则,update --dry-run monolog/monolog会明确告诉你是否要降级其他包 - 如果
outdated列了一堆,但update --dry-run直接失败,大概率是composer.lock手动改过或缓存过期,先跑composer clear-cache再试
怎么筛出真正该关注的更新项
默认输出信息密度低,尤其大项目。靠参数快速聚焦:
- 只看主版本变动:
composer outdated --major-only(比如2.x → 3.x,大概率含 BC break) - 只看已知有安全通告的包:
composer outdated --security-only(需先运行过composer audit,否则无数据) - 排除
require-dev干扰:composer outdated --no-dev - 强制检查所有包(含被约束锁死的):
composer outdated --all,但注意标灰的“not upgradable”只是提示,不代表真能升
安全更新不能只靠 outdated
它完全不读 CVE 数据,也不连任何漏洞库。一个包显示 2.10.0 → 2.11.0,但 2.11.0 可能刚曝出 RCE——outdated 不会告诉你。
- 查真实安全风险,必须用
composer audit(Composer 2.5+ 内置) - 更稳妥的做法是引入
roave/security-advisories,它通过conflict机制直接阻止安装已知问题版本 - 别跳过 CHANGELOG:哪怕
--patch-only提示可升,也得确认2.10.0 → 2.10.1里有没有隐藏的破坏性修复
真正动手前,永远先确认三件事:composer.json 约束是否允许、composer update --dry-run 是否通过、对应包的 CHANGELOG 里有没有 BC break。别让 outdated 的输出代替思考。










