composer show --format=json 是唯一正解,因其真实反映已安装状态、字段固定且支持结构化输出;配合 jq 提取 name/version 并排序可生成稳定可比对的依赖快照。

直接用 composer show --format=json 最可靠,不是 composer list 也不是 composer info —— 后两者不带版本号快照,也不输出结构化数据。
为什么 composer show --format=json 是唯一正解
导出“所有依赖版本号”本质是获取当前 vendor/ 实际安装的包名+版本组合,且要能用于文档归档或比对。只有 composer show 的 --format=json 模式满足三点:真实反映已安装状态(非 composer.json 声明)、字段固定(name 和 version 必存在)、可管道处理。
-
composer list只列命令,不输出依赖 -
composer info默认只显示顶层包,加-a会递归但格式混乱、无统一字段、不支持 JSON -
composer show不加--format是人眼友好格式,含描述和 license,难解析
导出为纯文本表格(适合粘贴进文档)
JSON 虽规范,但写进内部文档常需可读性更强的表格。用 jq 提取关键字段最稳:
composer show --format=json | jq -r '.[] | "\(.name)\t\(.version)"' | sort > deps.tsv
这样生成的是 tab 分隔的两列文件,Excel 或 Markdown 表格都能直接导入。注意:
- 必须装
jq(macOS 用brew install jq,Ubuntu 用apt install jq) -
sort保证顺序稳定,方便 diff 对比 - 别用
composer show | awk解析——空格不规整,symfony/console v6.4.0这类含空格的版本号会错位
避免误导出 dev-dependencies 到生产文档
很多项目把测试工具(如 phpunit/phpunit)放在 require-dev,但文档里混进去会误导运维或安全审计。默认 composer show 包含所有已安装包,不管声明位置。
如果只要 require 部分(即运行时依赖),得手动过滤:
composer show --format=json | jq -r 'to_entries[] | select(.value.type != "metapackage") | .value.name + "\t" + .value.version' | sort > runtime-deps.tsv
这里靠 .value.type != "metapackage" 排除 composer/installers 等元包,更稳妥的做法是结合 composer show --locked + 解析 composer.lock,但那需要额外脚本,超出一键范围。
真正容易被忽略的是:导出结果取决于当前 vendor/ 状态,不是 composer.json。删了 vendor/ 再跑,或者刚 composer update 还没 commit,导出的就不是你文档想记的那个快照。动手前先确认 git status 干净,再执行。










