composer show -a 仅列出 packagist 上所有已发布版本号,不提供变更日志、时间戳、提交哈希或链接;查更新内容需访问包仓库的 github releases、changelog.md 或用 git log/diff 对比版本。

composer show -a 只列版本,不等于有更新日志
Composer 本身不提供查看变更日志(changelog)的能力,composer show -a 输出的只是 Packagist 上已发布、未被废弃的所有版本号,比如 2.8.0、2.9.1、3.0.0-rc1,但它不会告诉你这两个版本之间改了什么、修复了哪个 issue、是否破坏了 API。
- 它依赖本地缓存(
~/.composer/cache/repo/https---packagist.org/),可能比实际发布晚几小时 - 不区分轻量 tag 和附注 tag:如果作者只推了
v2.9.0^{}(附注 tag),而没推v2.9.0(轻量 tag),composer show -a就看不到这个版本 - 输出里没有时间戳、没有提交哈希、没有链接 —— 它不是 changelog 查看器,只是版本快照浏览器
查更新记录得靠包自己维护的文档或 Git
真正能回答“v2.9.0 相比 v2.8.0 改了啥”的,只有包作者是否在 GitHub 上写了 CHANGELOG.md、打了 Release、或在 releases 页面填了描述。Composer 不抓取也不渲染这些内容。
- 优先打开
https://packagist.org/packages/{vendor}/{package}→ 点 “Source” 链接跳转到 GitHub/GitLab 仓库 - 直接访问
https://github.com/{vendor}/{package}/releases,找带绿色 “Latest release” 标签的条目 - 若仓库有
CHANGELOG.md,通常在根目录或docs/下;没有的话,只能点开每个 Release 看 “What’s Changed” 折叠区 - 部分包(如
symfony/*)会把 changelog 搬到官网文档页,比如https://symfony.com/doc/current/components/changelog.html
用 git log 或 diff 对比两个版本(需 prefer-source)
如果你用 "prefer-source": true 安装过该包(或手动删掉 vendor/{vendor}/{package} 后重装),本地就有 Git 克隆副本,这时才能用 Git 命令看差异。
- 先确认源类型:
composer show {vendor}/{package} | grep source,输出含"type": "git"才有效 - 查两个版本间提交:
git -C vendor/{vendor}/{package} log --oneline v2.8.0..v2.9.0 - 看文件变动范围:
git -C vendor/{vendor}/{package} diff --stat v2.8.0..v2.9.0 - 注意:tag 名必须完全匹配,
v2.9.0和2.9.0在某些仓库不等价;若提示 tag 不存在,先git -C vendor/{vendor}/{package} fetch --tags
别信 composer outdated 的“最新版”,它不反映真实兼容性
composer outdated 显示的“latest”是满足你当前 composer.json 中版本约束(如 "^2.0")的最高稳定版,不是全网最新版。它甚至不联网实时查,只读本地锁文件和缓存元数据。
- 例如你写
"monolog/monolog": "^2.0",composer outdated就不会显示3.5.0,哪怕它已发布 —— 因为不兼容 - 加
--all会列出3.5.0,但旁边会标not upgradable,不是 bug,是约束机制生效 - 它不校验 PHP 版本、扩展依赖是否满足新版本要求;
composer update时才真正做兼容性检查,可能失败 - 想预判升级风险?先
composer update --dry-run {package},再结合 GitHub Release 的 “Breaking Changes” 小节交叉验证
更新记录从来不在 Composer 里,而在包的 Git 仓库、Release 页面或作者写的文档中;工具只负责“装”,不负责“讲”。漏掉 changelog 直接升级,是最常见的线上事故起因之一。










