正确命令是composer outdated,它专用于检查可升级包,默认显示当前版与最新稳定版,支持--all、--direct、--format=json等参数精准决策;而composer show --latest非法,--all仅罗列版本无上下文。

composer show --latest 会报 unrecognized option?
是的,--latest 不是 Composer 原生命令行选项。你运行 composer show --latest 或 composer show -l 时,大概率看到 Unrecognized option: latest —— 这不是拼写错误,而是该参数根本不存在于 composer show 的合法选项列表中。
想看某个包有没有新版本,该用哪个命令?
正确姿势是 composer outdated,它才是专门设计来回答“哪些包能升、升到哪”的命令:
- 默认只显示有稳定新版本的包(跳过
dev-、alpha等) - 输出三列:
package-name、当前已安装版本、可升级到的最新稳定版 - 加
--all可包含预发布版本(如v3.0.0-RC1、dev-main) - 加
-f json输出结构化数据,适合脚本解析
例如:composer outdated monolog/monolog 能精准聚焦单个包;而 composer outdated --direct(Composer 2.11+)只检查你 require 的顶层包,跳过间接依赖,更贴近真实升级意图。
为什么不能用 composer show --all 查“最新版”?
composer show --all vendor/package 确实会列出远程所有可用版本,但它不告诉你「当前装的是哪个」,也不标注哪个是 latest —— 它只是把 Packagist API 返回的完整 versions 数组平铺出来,顺序无意义,且不含语义标记(比如 stable / latest 字段)。更关键的是:
- 它不校验本地是否已安装该包,所以结果和你当前项目状态完全脱钩
- 返回版本里混着大量废弃分支(
2.x-dev)、未打 tag 的 commit(dev-feature-branch),人工判断成本高 - 若包配置了私有仓库但没在
repositories中声明,--all会直接漏掉所有内部版本
换句话说:show --all 是“我能拿到什么”,而 outdated 是“我该升什么”。前者是元数据快照,后者才是升级决策依据。
CI 脚本里怎么安全判断某包是否需更新?
别解析 show --all 的文本输出,也别依赖 outdated 的退出码(它有新版本时返回 0,没更新时也返回 0 —— 和直觉相反)。可靠做法是:
- 用
composer outdated --direct --format=json | jq -e 'length > 0'判断是否有顶层包待更新(jq -e在非空时返回 0) - 对特定包,用
composer show vendor/package | grep -q "version.*[0-9]"先确认已安装,再用composer outdated vendor/package捕获输出并解析第二列 - 注意:Composer 2.11+ 的
outdated默认并行加载元数据,比旧版快,但若网络不稳定,可加--no-plugins避免插件干扰
真正容易被忽略的一点:如果你在 CI 中禁用了 dev 包(composer install --no-dev),那么 outdated 也不会检查 require-dev 下的包 —— 这不是 bug,是设计行为。要覆盖这个逻辑,得显式传 --with-dependencies 并确保 lock 文件里保留了 dev 包记录。


















