不能。composer show -P 只显示包名和版本,不包含源地址;可靠方式是解析 composer.lock 中的 dist.url 字段,因它记录安装时实际使用的镜像后直链,但需注意 URL 可能含临时 token 或需认证。

composer show -P 能否直接导出 URL 列表?
不能。composer show -P 只显示包名和版本,不包含源地址。Composer 本身没有内置命令一键导出所有依赖的下载 URL,因为 URL 取决于包的 dist.url(归档地址)或 source.url(仓库地址),且可能被镜像、重写或禁用(如私有包走 auth.json 认证)。必须结合 composer show --format=json 和解析逻辑手动提取。
如何从 composer.lock 提取真实 dist URL(推荐)
composer.lock 是最可靠来源——它记录了安装时实际使用的 dist.url,包括经镜像替换后的地址(如 packagist.phpcomposer.com → repo.packagist.org 的映射已生效)。只需解析 JSON 并过滤掉无 dist 或无 url 的条目:
jq -r '.packages[] | select(.dist and .dist.url) | "\(.name) \(.version) \(.dist.url)"' composer.lock
若未安装 jq,可用 PHP 快速替代:
php -r '
$lock = json_decode(file_get_contents("composer.lock"), true);
foreach ($lock["packages"] as $pkg) {
if (!empty($pkg["dist"]["url"])) {
echo sprintf("%s %s %s\n", $pkg["name"], $pkg["version"], $pkg["dist"]["url"]);
}
}'
为什么不用 composer show + composer config repos?
因为:
-
composer show不返回 URL,只返回 name/version/type -
composer config repos仅显示配置的仓库源,不反映每个包实际从哪下载(例如某些包可能被repositories中的package类型硬编码覆盖,或走dist镜像而非repo) - 私有包若启用
"packagist.org": false,其 URL 可能来自auth.json或自定义 VCS 配置,show完全不可见
注意 dist.url 可能是无效链接或需认证
导出的 dist.url 多数是 tarball 直链(如 https://api.github.com/repos/monolog/monolog/zipball/...),但:
- 部分 URL 带临时 token,过期即 404
- 私有 GitLab/GitHub Enterprise 包的 URL 可能需
auth.json中的 token 才能访问 - 某些包禁用 dist(
"dist": null),只能走source.type+source.url,此时需额外判断并拼接 tag/commit 归档路径(如https://gitlab.example.com/foo/bar/-/archive/v1.2.3/bar-v1.2.3.tar.gz)










