
Composer 本身不提供包的“最后更新时间”或“发布时间”,composer show 输出里没有 updated_at 或 published_at 字段;你看到的只是本地 composer.lock 记录的安装时间(非发布)、包的静态元信息(如版本、许可证、描述),和它声明的源码仓库地址。
为什么 composer show 查不到发布时间?
Composer 的设计目标是依赖解析与安装,不是包生命周期管理。它不对接 Packagist 的发布时间数据,也不拉取 Git tag 的 commit 时间——这些信息在 show 命令执行时根本不会被请求。
-
composer show vendor/package只读取vendor/composer/installed.json和包自身的composer.json,两者都不含时间戳 - 所谓“更新时间”,用户常混淆三类不同时间:Packagist 上版本发布的 UTC 时间、Git 仓库对应 tag 的创建时间、你本地
vendor/目录的修改时间 —— 它们彼此无关 - 即使你刚
composer update过,show也不会告诉你“这个包是今天发布的”,只会说“当前装的是 v2.5.0”
怎么实际查到某个包的发布时间?
得绕过 Composer,直连源头。最可靠的是调用 Packagist API,它明确返回每个版本的 time 字段(即 packagist.org 收录该版本的时间,通常等于作者 push 的时间):
curl -s 'https://packagist.org/packages/vendor/package.json' | jq -r '.package.versions."dev-main".time'
- 把
vendor/package换成真实包名,比如guzzlehttp/guzzle - 注意:API 返回的是所有版本对象,需按 key(如
v7.8.1)索引;dev-main是开发分支别名,不一定存在 - 如果没装
jq,可用浏览器打开https://packagist.org/packages/vendor/package,点进某个版本号,右上角显示的日期就是发布时间 - Git 仓库时间更“原始”,但需确认该包确实在 GitHub/GitLab 打了 tag:
git ls-remote --tags https://github.com/vendor/package.git | tail -5
composer outdated 会显示更新时间吗?
不会。composer outdated 只对比 composer.lock 里的已安装版本和当前约束下“可升级到的最高兼容版本”,输出三列:package、installed、latest。它不关心这些版本哪天发的,也不管有没有安全修复——除非你加 --security-only(这时只过滤带已知 CVE 的版本,但依然不显示时间)。
-
outdated --all会列出全部已安装包,并标出是否最新,但“最新”指满足composer.json约束的最新,不是绝对最新 - 如果你的
composer.json锁死"monolog/monolog": "2.9.0",哪怕 2.10.0 是昨天发布的,outdated也完全不提它 - 私有仓库或 fork 的包,
outdated默认仍比对 Packagist,结果可能误导你——这点在 CI 脚本里特别容易漏掉
真正要追踪发布时间,就得接受一个事实:Composer 不是包时间数据库。你得自己拼接 Packagist API、Git tag、甚至项目 CHANGELOG.md 里的手写记录。最容易被忽略的是——composer.lock 里其实存了每个包的 source 类型和 reference(commit hash),但它不存这个 hash 对应的提交时间;想靠它反推,还得额外查一遍 Git 服务的 API。










