composer show 不加 -a 仅显示本地已安装版本及缓存中的少量版本(如曾安装过的 2.x、3.x),不联网、不查 Packagist,输出的 versions 非全量历史版本;latest 是 Packagist 标记的最新稳定版,latest-stable 则受 minimum-stability 过滤;未安装包会报错“Package not found”;查全部可用版本必须用 composer show -a。

composer show 不加 -a 只显示已安装版本和“latest”信息
执行 composer show monolog/monolog 时,输出里看到的 versions 字段其实不是“所有可用版本”,而是 Composer 缓存中**当前已知且可能安装过**的几个版本(比如你本地装过 2.x,又升级到 3.x,它就只列 2.10.0、3.5.0 和 dev-main)。它不联网,也不刷新 Packagist 数据。
常见误解是:以为这个列表就是全部历史版本。实际它甚至不包含 1.x 或 2.8.0 这类旧版 —— 除非你曾经在某个项目里装过,或者 Composer 之前缓存过。
- 只反映本地缓存状态,不是远程全量数据
- 输出中的
latest是 Packagist 标记的最新稳定版,latest-stable是按minimum-stability过滤后的结果,两者可能不同 - 如果包没装过,直接
composer show vendor/package会报错:Package not found
查 Packagist 上所有发布过的版本必须用 composer show -a
composer show -a monolog/monolog 是唯一能绕过本地缓存、直连 Packagist API 获取完整版本列表的命令。它返回的 versions 字段包含所有 tagged release(如 3.5.0、2.10.0)、预发布(3.4.0-RC1)和活跃分支(dev-main、dev-3.x)。
注意:这个命令依赖 composer.json 中配置的仓库源。私有包查不到?先确认 repositories 是否生效,token 是否有效;国内用户若超时,可临时切回官方源:composer config -g repo.packagist composer https://packagist.org。
-
-a和--all等价,但别写成--all-remote或--remote—— 这些参数不存在,会报错 - 拼错包名(如
monolog/monolig)会直接提示Package not found,不是命令失败,而是 Packagist 上真没这个命名空间 - 输出太长想只看版本号?推荐用
composer show -a --format=json monolog/monolog | jq -r '.versions | join("\n")';没jq就用grep "versions:" | cut -d: -f2 | tr ',' '\n' | sed 's/^[[:space:]]*//',但字段顺序可能随 Composer 版本微调
已安装包的真实版本只能靠 composer show(不加 -a)确认
你想知道项目里实际跑的是哪个版本?必须用 composer show monolog/monolog(不加 -a)。它读的是 vendor/composer/installed.json,不联网、不查 Packagist,所以快、稳、反映真实运行态。
如果你刚执行过 composer install --no-dev,那 phpunit/phpunit 就不会出现在结果里 —— 即使它还在 composer.json 的 require-dev 里。这也意味着:删了 vendor 目录后,所有 composer show 命令都会失败或返回空,它不会退而求其次去读 composer.lock。
- 包名大小写敏感:
symfony/console和Symfony/Console是两个包,输错就查不到 - 要确认某包是否被间接升级过?对比
composer show foo/bar和git diff composer.lock中对应区块 - 发现版本和预期不符?检查
minimum-stability设置(比如设成stable就不会装dev-main),或是否存在conflict规则压制了升级路径
composer show -a composer/composer 是查 Composer 自身更新的正解
composer --version 只告诉你本地版本号和官方 PHAR 构建时间,**完全不联网、不比较新旧**。很多人看到 2.7.7 就以为是最新,其实 2.8.0 可能已发布两周。
查 Composer 自身有没有新版,唯一可靠方式是:composer self-update --dry-run。它联网比对稳定通道,输出明确提示,且不真正升级。
如果你想看 Composer 所有历史 tag(比如验证某个 bug 是否在 2.6.0 就存在),可以用:composer show -a composer/composer。这是把 Composer 当普通包来查 —— 它强制刷新缓存、直连 Packagist,返回的 versions 字段才是真实可用列表。
-
self-update --dry-run在 CI 环境中可能因putenv()被禁用而失败,需显式指定 PHP 路径:/usr/bin/php -d "disable_functions=" /usr/local/bin/composer self-update --dry-run -
show -a composer/composer输出中,顶部的latest不代表“最新可用”,要看versions字段里的完整列表 - 别信
composer show --latest—— 这个命令根本不存在,是常见误输
最常被忽略的一点:没有 vendor 目录时,所有 composer show 命令都失效;-a 虽然能联网,但它查的是 Packagist,不是你本地项目状态 —— 两者目的完全不同,混用就会查错地方。


















