查包版本分两层:composer show vendor/package查本地已安装版本,仅读vendor/composer/installed.json,不联网;composer show --all vendor/package查远程所有可用版本,直连Packagist拉取全量列表,包括稳定版、预发布版和开发分支。

查包版本这件事,本质是分两层:你项目里实际装了什么,和远程仓库到底有哪些可选。混用命令会得到完全不同的答案,必须先分清目标。
composer show vendor/package-name 查当前安装版本
这个命令只读 vendor/composer/installed.json,不联网、不刷新缓存,反映的是此刻 vendor/ 目录的真实状态。
- 包只在
require-dev里,但上次用了composer install --no-dev→ 查不到 - 刚改了
composer.json但没跑composer install或composer update→ 显示的仍是旧版本 - 大小写敏感:
monolog/monolog和Monolog/Monolog是两个包,输错直接报Package not found - 想脚本化提取纯版本号?加
--format=json后用jq或php -r解析,例如:composer show monolog/monolog --format=json | php -r "echo json_decode(file_get_contents('php://stdin'))->version;"
composer show --all vendor/package-name 查远程所有可用版本
这才是真正“查有哪些可选”的命令,它直连 Packagist API(或你配置的私有源),拉取全部未被标记为 abandoned 的版本,包括 dev-main、3.5.0-RC1、2.10.0 这类。
- 漏掉
--all或写成-all(单横杠)→ 命令退化为查本地已安装版,不是你要的全量列表 - 私有 Git 包查不到?确认
composer.json的repositories已正确定义,且 token 有效 - 国内用户遇到版本明显滞后?可能是镜像源同步延迟,临时切回官方源:
composer config -g repo.packagist composer https://packagist.org - 输出太长只想看版本号?推荐:
composer show --all monolog/monolog --format=json | jq -r '.versions | join("\n")'没jq就用grep+cut,但注意versions:行位置可能随 Composer 版本微调
为什么 composer outdated 不适合查版本列表
composer outdated 只列出 composer.lock 中已安装、且存在「更高稳定版」的包,默认忽略 dev、beta、RC,也不显示历史旧版或降级选项。
- 你想确认
2.9.0是否还被支持?它不会告诉你 - 你怀疑某依赖卡在
dev-develop分支?它默认不扫描这类分支 - 要查间接依赖(transitive dependencies)?得显式加
--all参数,否则只看require直接声明的包 - 它不解决“有哪些版本可选”,只回答“我装的这个,有没有更稳的新版”
Packagist 网页比 CLI 更权威的三个场景
命令行快,但网页信息更全——尤其当你要判断某个版本是否真能用时。
- 版本是否被作者标记为
abandoned?CLI 不显示,网页Versions区域会标红 - 某个
v1.2.3版本的发布时间、Git commit、是否stable?CLI 不提供,网页点开单个版本就能看到 - 该版本要求的 PHP 版本、扩展依赖(如
ext-json)、其他包约束?CLI 要用composer show vendor/package version单独查,网页直接列在详情页 - 包根本不在 Packagist 上(比如纯私有 Git 包)?网页查不到,这时只能靠
git ls-remote --tags或私有仓库 UI
真正容易被忽略的点是:版本号本身不带兼容性保证。一个 3.5.0 能不能跑,取决于它 require 的 PHP 版本是否匹配你 composer.json 里的 platform 配置,而不是数字大小。别只盯着版本号升没升,先看 composer show vendor/package 3.5.0 输出的依赖树和平台要求。











