不能。composer show 默认只显示已安装或最新稳定版,不列出历史tag;查全部tag需用git ls-remote --tags或Packagist API,而非Composer命令。

composer show 能看到所有 tag 吗?
不能。默认 composer show vendor/package 只显示当前已安装版本或最新稳定版,不列出历史 tag。它查的是 Composer 的包元数据缓存(packages.json),不是 Git 仓库的完整 tag 列表。
真正能拉出全部 tag 的,是 Packagist API 或直接查 VCS 源。但 Composer 本身没提供「一键下载所有 tag」的命令——这不是它的设计目标,它只管依赖解析和安装指定版本。
用 git ls-remote 获取全部 tag 最可靠
如果包托管在 GitHub/GitLab 等支持 Git 协议的地方,最直接的方式是绕过 Composer,用 Git 命令查远端 tag:
例如查 monolog/monolog 的所有 tag:
git ls-remote --tags https://github.com/Seldaek/monolog.git
输出里会包含类似 abc123 refs/tags/1.0.0^{} (轻量 tag)和 def456 refs/tags/1.0.0 (带附注 tag),注意重复项要去重(末尾带 ^{} 的是附注 tag 的签名对象,对应同一个 tag 名)。
常见错误:直接 git clone 一个 repo 再 git tag —— 这样只能看到本地已 fetch 的 tag,默认 clone 不带所有 tag。
- 必须加
--tags参数才能一次性 fetch 全部 tag - 如果只想看 tag 名(去重后),可用管道:
git ls-remote --tags ... | grep -v '\^{}$' | cut -d/ -f3 | sort -V - 某些私有包用 SSH 地址时,确保本地 SSH key 已配置且可访问
为什么 composer archive 不适合批量下载所有 tag?
composer archive 是为单个版本打包用的,它依赖 composer.json 中定义的 archive 配置(比如排除测试文件),而且必须先让 Composer 认识这个版本——也就是说,你要手动把每个 tag 写进 require 或 repositories 才能触发下载。
性能与兼容性影响明显:
- 每执行一次
composer require vendor/package:dev-master#commit-hash或composer require vendor/package:v1.2.3,都会触发完整依赖解析,慢且可能失败(尤其当某 tag 的composer.json依赖已失效) - Composer 会自动转换 tag 为
dev-别名(如v1.2.3→dev-master#xxx),导致你实际下载的未必是你以为的那个 tag commit - 没有内置机制跳过依赖检查,也无法并发下载
真要批量下载源码,脚本比 Composer 更可控
与其折腾 Composer,不如写个简单脚本,用 git archive 或 curl 直接从 GitHub Release API 或 Git 服务下载 tarball:
例如 GitHub 上多数 tag 对应 release,可用:
curl -sL "https://api.github.com/repos/Seldaek/monolog/releases" | jq -r '.[] | select(.tag_name) | .tag_name'
再配合 curl -L "https://github.com/Seldaek/monolog/archive/refs/tags/v2.10.0.tar.gz" -o monolog-v2.10.0.tar.gz 下载。
容易踩的坑:
- 不是所有 tag 都有 GitHub Release,有些只有 lightweight tag,得回退到
git archive+git upload-archive方式 - GitHub API 有速率限制(未登录 60次/小时),记得加
-H "Accept: application/vnd.github.v3+json" - 私有仓库需传
-H "Authorization: Bearer xxx"
源码研究时,别被 Composer 的“包管理”表象带偏——它不等于 Git 管理器,历史 tag 是 VCS 层的事,工具链要分清边界。










