Composer 本身不提供包的更新时间,composer show 仅显示静态元信息(如名称、版本、许可证等),不含发布时间;准确获取需调用 Packagist API 的 time 字段。

Composer 本身不记录或暴露包的“更新时间”(比如 packagist.org 上某次版本发布的具体时间戳),composer show 输出里也没有 updated_at 字段。所谓“查看依赖包的详细更新时间”,实际只能间接获取:要么查 Packagist API,要么看该包 Git 仓库的 tag 时间,要么依赖本地 vendor 中的 composer.lock 里记录的安装时间(非发布时间)。
composer show 能看到什么?——字段含义与局限
composer show 是查看已安装包元信息的命令,但它的输出是静态的、基于 composer.lock 和 composer.json 的快照,不含时间线数据:
-
name:包名(如monolog/monolog) -
versions:可用版本列表(来自当前配置源,不是实时远程) -
type:包类型(library/project等) -
license:许可证声明(取自composer.json) -
source:Git 仓库地址 + 分支(若为 VCS 包) -
dist:ZIP 包下载地址 + SHA256(若为 dist 包) -
names:提供(provide)的虚拟包名(如psr/log-implementation)
注意:composer show monolog/monolog 不会显示 “2024-03-15 发布了 v3.5.0” 这类信息 —— 它压根不联网查 Packagist,也不解析 Git tag 时间。
如何查某个包最新版的实际发布时间?——用 Packagist API
Packagist 官方 API 提供了每个版本的 time 字段,即该版本在 Packagist 上注册的时间(通常 ≈ GitHub tag 推送时间)。这是最接近“更新时间”的权威来源:
curl -s "https://packagist.org/packages/monolog/monolog.json" | jq '.package.versions."dev-main".time'
常见操作建议:
- 替换 URL 中的
monolog/monolog为你想查的包名(URL 编码需处理,如symfony/console→symfony%2Fconsole) - 用
jq提取.package.versions下任意版本(如v3.5.0或"dev-main")的time - 若无
jq,可用 Python 快速解析:python3 -c "import json, sys; print(json.load(sys.stdin)['package']['versions']['v3.5.0']['time'])" < response.json
- 注意:API 返回的是 UTC 时间字符串(如
"2024-03-15T12:47:22+00:00"),不是本地时区
为什么不能靠 composer.lock 判断“更新时间”?
composer.lock 里确实有 packages 数组,每个包含 time 字段,但它表示的是你本地执行 composer update 时,Composer 记录该版本被锁定的时间,不是包作者发布的原始时间:
- 这个
time是写入 lock 文件那一刻生成的(如"2024-04-01T10:22:33+00:00"),和远程发布无关 - 多人协作时,不同人
composer install后的 lock 文件时间可能不一致 - 如果包是通过
require直接指定分支(如"dev-main"),lock 文件里的time可能为空或为 null - 想查本地上次更新时间?直接
stat -c %y composer.lock(Linux/macOS)更准
进阶技巧:批量查多个包的发布时间
如果你维护一个项目,想快速知道所有直接依赖的最新版发布时间,可以结合 composer show --direct --no-dev --format=json 和 Packagist API:
composer show --direct --no-dev --format=json | \
jq -r '.packages[] | "\(.name) \(.version)"' | \
while read pkg ver; do
echo "$pkg@$ver: $(curl -s "https://packagist.org/packages/$pkg.json" 2>/dev/null | jq -r ".package.versions[\"$ver\"].time // \"not found\"")"
done
注意点:
- 该脚本假设
$ver在 API 响应中存在对应 key(实际可能带v前缀,或为dev-分支) - 网络请求无并发控制,大量包时建议加
sleep 0.1避免被限流 - Packagist 对未认证请求有速率限制(约 10 请求/分钟),生产脚本应加缓存或使用 token
真正需要“更新时间”的场景,几乎都绕不开 Packagist API;而 composer show 的作用,其实是确认当前锁定了哪个版本、从哪来的、有没有冲突别名——它不是审计工具,也不是发布日志查看器。










