查 Composer 自身最新版本唯一可靠方式是 composer self-update --dry-run;查项目依赖包最新可用版本必须用 composer outdated,其他命令均无效或误导。

查 Composer 自身最新版本,唯一可靠方式是 composer self-update --dry-run;查项目依赖包的最新可用版本,必须用 composer outdated,其他命令要么无效、要么误导。
composer --version 只告诉你“现在跑的是谁”,不联网也不比较
执行 composer --version 输出类似 Composer version 2.7.7 (2024-06-12 13:45:00),其中 2.7.7 是当前运行的版本号,括号内是官方 PHAR 构建时间戳——不是你安装时间,更不代表它是最新版。这个命令完全不访问 Packagist,也不做任何比对。
常见误操作:
- 看到
2.7.7就以为安全,其实2.8.0可能已发布两周 - 用
composer -v想看版本,结果只输出帮助信息(-v是 verbose 开关,不是 version) - 在 CI 或容器里报
command not found,其实是composer不在$PATH,和版本无关
composer self-update --dry-run 是查 Composer 自身更新的唯一正解
它会联网直连 Packagist,比对当前版本与稳定通道最新版,并安全提示是否需升级,且不修改任何文件。
典型输出:
You are already using the latest stable version.A new stable version is available: 2.8.0 (current: 2.7.7)
注意事项:
- 不加
--dry-run直接运行composer self-update会立刻升级,手滑即生效 - 某些 CI 环境禁用
putenv(),需显式指定 PHP 路径:/usr/bin/php -d "disable_functions=" /usr/local/bin/composer self-update --dry-run - 想看所有历史版本?用
composer show -a composer/composer,注意包名是composer/composer,不是composer
composer outdated 才是查项目依赖最新版的正确入口
它基于 composer.lock 和 composer.json 的版本约束,比对 Packagist 上满足条件的最新稳定版,结果真实反映可升级空间。
关键参数组合:
-
--direct:只显示composer.json里直接声明的包,避免被传递依赖干扰 -
--minor或--patch:限制只看小版本或补丁更新,降低 BC break 风险 -
--no-dev:排除require-dev下的包,聚焦生产依赖 -
--format=json:输出结构化数据,便于脚本解析或 CI 告警 -
--all:强制列出全部已安装包(含间接依赖),否则默认只报直接依赖
注意:composer show --latest 是给单个包用的(如 composer show monolog/monolog --latest),但它不适用于 Composer 自身,也不等价于全局检查。
别信“实时”“自动”“监控”这类词,底层全是离线比对
composer outdated 的结果依赖本地 composer.lock 和缓存状态。如果很久没运行过 composer install,它看到的“最新版”可能已经滞后——因为 Packagist 上早有新 tag,但你的锁文件没刷新过。
真正接近“实时”的做法只有两个:
- 加
--no-cache强制跳过本地缓存,直连 Packagist(如composer outdated --no-cache) - 先
rm composer.lock再composer install --no-install(仅解析不写入),但这已超出“查版本”范畴,属于求解行为
第三方插件如 composer-versions-check 是在 update 后做提醒,不是检测机制本身;它不改变 outdated 的逻辑基础——所有判断仍来自锁文件与约束的离线比对。


















