composer如何导出项目中所有依赖的URL_composer生成下载链接清单【方法】

18次阅读

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

composer如何导出项目中所有依赖的URL_composer生成下载链接清单【方法】

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 %sn", $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

所以生成清单后务必验证关键 URL 是否可公开访问或是否已配置对应凭证。

text=ZqhQzanResources