composer outdated 是唯一正解,用于检查当前锁文件版本与 packagist 最新稳定版差异,受 composer.json 约束限制,输出 vendor/package、installed(来自 composer.lock)、latest(约束内最高稳定版)三列,带 ! 表示主版本跃迁需人工核验。

composer show --outdated 在 Composer 2.2+ 中已失效,直接执行会报错:Command "show --outdated" is not defined。别浪费时间试这个组合——它不是被弃用,而是根本不存在。
composer outdated 是唯一正解
想预览所有需更新的包,必须用 composer outdated。它和旧版 composer show --outdated 不是兼容关系,而是彻底替代:前者是独立子命令,后者在新版中连语法解析都通不过。
- 默认只显示「当前锁版本 ≠ Packagist 最新稳定版」的包(受
composer.json版本约束限制) - 无任何输出 ≠ 没有可更新包,只代表所有已安装包都满足其约束下的最新稳定版
- 输出三列:
vendor/package、installed、latest,其中installed来自composer.lock,latest是 Packagist 上当前稳定性策略下匹配约束的最高 tag - 带
!标记的行表示主版本跃迁(如symfony/console 5.4.39 → 6.0.19!),这类必须人工核验 BC break
--all 和 --direct 的实际效果差异
不加参数时,composer outdated 默认只检查 require 和 require-dev 中显式声明的包,忽略所有间接依赖。这容易让你误判“项目很干净”,其实 monolog/monolog 或 psr/log 可能已落后多个小版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer outdated --all:强制列出所有已安装包(含插件、replace包、dev包),每行末尾标(latest)或(outdated) -
composer outdated --direct:等价于不加参数,但语义更明确;适合 CI 脚本中只关注自己写的依赖项 -
composer outdated --minor-only:过滤掉带!的主版本升级,只留2.8.0 → 2.9.3这类
为什么你看到的 latest 版本和 GitHub Release 对不上
composer outdated 的 latest 列不查 GitHub,只读本地缓存的 Packagist 元数据(路径:~/.composer/cache/repo/https---packagist.org/packages.json)。这意味着:
- 私有镜像源未同步最新 tag → 显示“无更新”,但实际已有新版
- 缓存过期(尤其跨周未清理)→
latest停留在上周的版本 - 包作者发了
v3.0.0-rc1,但你配置了"minimum-stability": "stable"(默认)→ 直接被过滤,不会出现在结果里 - 想确认真实最新版?用
composer show --all vendor/package | head -n 5查远程所有可用版本
CI 中安全判断是否需升级的关键细节
别依赖输出内容做 if 判断——空输出时命令退出码仍是 0,无法触发失败逻辑。真正可靠的做法是统计 JSON 输出中的包数量:
composer outdated --format=json | jq '.packages | length'
这个值为 0 才代表真没过期包。另外两个常被忽略的点:
-
composer outdated不检测安全漏洞,有风险得补composer audit - 全局工具(如
laravel/installer)必须用composer global outdated,和项目命令完全隔离










