composer show 是首选依赖报告工具,因它真实反映 vendor/ 目录中已安装包而非声明或快照;支持 JSON 输出便于结构化处理,但需注意 --no-dev、字段大小写及空值处理;导出 HTML/CSV 应借助专用工具如 akeneo/license-checker 或 jq,避免硬编码;审计前须用 composer-unused 清理僵尸依赖并校验 composer.lock。

直接用 composer show 就能生成最准的依赖报告,但它默认输出的是人眼可读的纯文本,不是结构化报表——想导出为 Markdown、HTML 或 Excel,得靠组合命令或专用工具,不能指望它原生支持。
为什么 composer show 是首选起点
它读的是 vendor/ 目录下真实安装的包,不是 composer.json 里写的声明,也不是 composer.lock 里记录的快照。这意味着:本地删过某个包、install 时跳过平台约束、甚至手动改过 vendor/,composer show 都能如实反映。
-
composer show不加参数 → 只列直接依赖(require中声明的) -
composer show -t→ 输出完整依赖树,但纯文本、无结构、难解析 -
composer show --format=json→ 所有已安装包的扁平列表,含name、version、description、source.type,适合后续处理 -
composer show --locked→ 强制只读composer.lock,不校验composer.json是否变更,适合 CI 中比对环境一致性
composer show --format=json 怎么用才不踩坑
JSON 输出看着干净,但容易忽略几个关键点:
- 它默认包含
require-dev包,生产环境导出清单必须加--no-dev:composer show --no-dev --format=json - 字段名大小写敏感:
.name和.version是小写,jq写错会报错 - 有些包没填
description,jq提取时要用// ""防空值崩溃:jq -r '.[] | "\(.name)\t\(.version)\t\(.description // "")"' - 输出不含版本约束(如
^2.0),只有实际安装版本;要查约束得看composer.json
导出 HTML 或 CSV 报表,别硬刚 composer show
它不支持 --format=html 或 --output=md,强行用 sed 或 awk 拼 HTML 容易漏转义、格式错乱。推荐两个更稳的路径:
- 许可证+版本+作者三合一 HTML 表格:装
akeneo/license-checker,运行vendor/bin/license-checker export --format=html --output=licenses.html。注意私有包若没定义license字段会标unknown,可加--ignore-unknown - 轻量级 CSV 导出(方便 Excel 筛选):同上工具,换
--format=csv;或者用composer show --no-dev --format=json | jq -r '["Name","Version","License"], (.[] | [.name, .version, (.license // ["Unknown"])[0]]) | @csv)' > deps.csv(需 jq 1.6+)
最容易被忽略的“准”字在哪
导出报告前,先跑一遍 composer-unused 清掉没用的 require 包——否则报表里混着“僵尸依赖”,审计就失真了。再确认 composer.lock 已提交、CI 中严格校验其哈希,比花时间美化 HTML 格式重要得多。真正影响部署和合规的,从来不是表格有没有边框,而是 monolog/monolog 到底装没装、装的是不是 2.9.3、它的 license 字段是不是空着。


















