composer outdated 默认只显示符合 composer.json 版本约束的可升级包,无输出常因版本写死、使用 dev-main、composer.lock 滞后或 minimum-stability 限制;需结合 --all、--direct、--dry-run 等参数排查兼容性与可行性。

composer outdated 是唯一能直接列出待升级包的命令,但它默认只显示符合当前 composer.json 版本约束的更新,不是“所有新版”。没输出不等于没得升,更可能是约束太死、用了 dev-main、composer.lock 滞后,或 minimum-stability 卡住了 beta 版。
为什么 composer outdated 没输出?
常见原因不是包真最新,而是检查逻辑被拦住了:
-
"monolog/monolog": "2.9.0"这种写死版本,连2.9.1都不会提示,因为不满足语义化版本“允许范围” - 用了
dev-main或dev-develop分支,默认不查,必须加--all -
composer.lock被手动改过或没提交,outdated依赖 lock 判断,状态失真 -
"minimum-stability": "stable",而新版本是rc或beta,它直接跳过
composer outdated --all 和 --direct 的区别
--all 强制扫所有已安装包,不管是否超出当前约束;--direct 只扫你亲手写进 composer.json 的那几行——这两个参数经常一起用,因为你想知道“我该改哪几行才能升”:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 加了
--all后,如果某包显示current: 2.5.0 → latest: 3.0.0,但旁边标着constraint: ^2.5,说明必须先改composer.json才能真正升级 -
--direct能过滤掉传递依赖干扰,优先处理你自己声明的包,比如laravel/framework或guzzlehttp/guzzle - 带
!标记的行表示有安全公告,这类包建议优先加入更新列表
别跳过 composer update --dry-run
outdated 是静态比对,update --dry-run 才是真实依赖解析器跑一遍,它能暴露 outdated 完全看不到的问题:
- 某个包升了,但它的子依赖(比如
doctrine/dbal)还没适配,Composer 会卡住并报错Your requirements could not be resolved - PHP 版本或扩展不满足新包要求,
--dry-run会明确提示The requested PHP extension ext-xml is missing - 它还会告诉你哪些包会被降级、哪些会被移除 —— 这些在
outdated输出里完全不体现
真正容易被忽略的是:即使 outdated 显示“可升”,也得靠 --dry-run 验证可行性;而即使 --dry-run 通过,上线前仍要检查 BC break,尤其是 major 版本跃迁后的接口变更。










