composer outdated 默认仅检查 composer.json 中直接声明的依赖,不扫描间接依赖;无输出常因版本写死、minimum-stability 限制或 composer.lock 滞后,需用 --all 查全部包,红/黄/! 色标分别表示主版本跃迁、补丁更新及bc-breaking风险。

composer outdated 默认只报你亲手写进 composer.json 的包,monolog/monolog 这类被 laravel/framework 带进来的间接依赖,压根不会出现在默认输出里——这不是 bug,是设计如此。
为什么 composer outdated 没输出,但项目明显该升了?
最常见原因是它只扫描 require 和 require-dev 里显式声明的包,不递归检查传递依赖。比如你没直接 require monolog/monolog,哪怕它已停更三年、存在 CVE,也不会列出来。
- 运行
composer outdated --all才能看到全部已安装包(含间接依赖和suggest包) - 加
--no-dev跳过开发依赖,减少干扰 - 如果输出仍是空的,先确认
composer.lock是否陈旧:composer update --lock刷新后再试 - 私有仓库未配置
repositories?对应包根本不会参与比对
怎么看颜色和 ! 号到底在警告什么?
终端里的红、黄、无色不是装饰,是风险等级信号;! 更是高危提示:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 红色行(如
symfony/console v5.4.32 → v6.0.19):主版本跃迁,极可能破坏兼容性 - 黄色行(如
guzzlehttp/guzzle v7.8.1 → v7.8.2):仅补丁更新,大概率安全 - 带
!的行(如doctrine/dbal 3.6.4 → 3.7.0 !):Composer 自动识别出 BC-breaking 更改,哪怕只是次版本也得查 CHANGELOG - 没颜色 = 当前版本已是约束范围内最新,或被固定版本锁死(如
"phpunit/phpunit": "9.5.10")
怎么过滤出真正可安全升级的包?
别盲目信 outdated 列出来的所有项——它只告诉你“能升”,不保证升完能跑通。
- 聚焦小版本更新:
composer outdated --minor-only(跳过所有v2.x → v3.x) - 快速定位高风险项:
composer outdated --major-only - 只看直接依赖(避免被几十个子依赖淹没):
composer outdated --direct - 结构化输出供脚本处理:
composer outdated --all --format=json | jq -r '.packages[] | select(.latest_status == "major") | "\(.name) \(.installed.version) → \(.latest.version)"'
为什么有些包明明有新版,却始终不出现在 outdated 里?
核心原因在于 Composer 的比对逻辑严格受限于三重约束:你的 composer.json 版本写法、minimum-stability 设置、以及当前 PHP 平台环境。
- 版本约束太紧:写死
"foo/bar": "1.2.3"或~1.2.0,即使 1.2.10 已发布也不会提示 -
minimum-stability是stable(默认),但新版本标了(RC)或beta,就不会被纳入比较 - 设置了
platform.php(如"platform": {"php": "8.1"}),而新包要求 PHP 8.3,它会被直接过滤掉 - 包被
replace或provide替代(如用psr/log-implementation替了monolog/monolog),Composer 认为“功能已覆盖”,不视为过时
真正麻烦的是那些被间接依赖拖住的包——比如 A 依赖 B v1,B v2 已支持 PHP 8.3,但 A 还没发新版,你就卡在 B v1。这种问题 outdated 看不见,composer depends vendor/package 和 composer update vendor/package --dry-run 才是破局关键。










