composer如何查看某个依赖包的详细更新时间_composer show包信息详解【实战】

8次阅读

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

composer如何查看某个依赖包的详细更新时间_composer show包信息详解【实战】

Composer 本身不记录或暴露包的“更新时间”(比如 packagist.org 上某次版本发布的具体时间戳),composer show 输出里也没有 updated_at 字段。所谓“查看依赖包的详细更新时间”,实际只能间接获取:要么查 Packagist API,要么看该包 git 仓库的 tag 时间,要么依赖本地 vendor 中的 composer.lock 里记录的安装时间(非发布时间)。

composer show 能看到什么?——字段含义与局限

composer show 是查看已安装包元信息的命令,但它的输出是静态的、基于 composer.lockcomposer.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/consolesymfony%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.locklinux/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 的作用,其实是确认当前锁定了哪个版本、从哪来的、有没有冲突别名——它不是审计工具,也不是发布日志查看器。

text=ZqhQzanResources