composer show --tree 输出缩进式文本树结构,顶层包顶格、子依赖逐级缩进两格,仅适合人工查看依赖路径,不包含版本约束、dev 包及来源类型,无法用于自动化处理。

composer show --tree 输出的是什么结构
它输出的是缩进式文本树,层级靠空格缩进体现,不是 JSON 或 XML 这类可解析格式。顶层包顶格,被依赖的包缩进两格,再下一层缩进四格,以此类推。这种结构适合人眼快速判断「谁依赖了谁」,但无法直接用于自动化处理或生成架构文档。
常见错误是把 composer show --tree 的输出当完整依赖图——它默认跳过 require-dev 中的包(比如 phpunit/phpunit),也不会显示版本约束(如 ^2.0)或来源类型(dist 还是 source)。如果你在写 CI 脚本或生成文档,仅靠这个命令会漏掉关键信息。
使用场景很明确:临时查某包是否被引入、快速定位循环依赖、给同事发个截图说明依赖路径。不适合存档、审计或集成到文档生成流水线。
如何导出带版本号的扁平依赖列表(用于 Markdown 文档)
用 composer show --format=json + jq 提取最稳。它读的是 vendor/ 实际安装状态,字段固定、无 ANSI 控制符、不随终端宽度截断。
-
composer show --format=json | jq -r '.packages[] | "\(.name) \(.version)"' | sort > deps.md—— 生成带版本的有序列表,适合粘贴进 README - 要排除开发依赖,加
--no-dev参数:composer show --no-dev --format=json | jq -r ... - 如果没装
jq,macOS 可用brew install jq,Linux 用apt install jq,Windows 建议用 WSL;别用cut -d' ' -f1,2硬切,包名含空格时会崩 - 注意
.version字段可能是dev-main或2.10.0,都保留,这是真实安装状态
为什么不能直接用 composer.lock 生成架构图
composer.lock 是权威快照,但它本身不描述依赖关系拓扑。它的 packages 数组是扁平的,没有父子指向;依赖链藏在每个包的 require 字段里,但那是声明式约束,不是运行时实际加载路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
想自动生成架构图(比如 Mermaid 或 PlantUML),必须做两件事:
- 先用
composer show --tree或composer show --format=json --all获取实际安装的包及其层级 - 再用脚本递归解析每个包的
require列表,补全缺失的间接依赖(比如 A → B → C,但 C 没出现在packages里,说明被跳过了) - 旧版 Composer(--locked 参数,直接读
composer.lock可能和vendor/状态不一致;务必先确认vendor/存在且完整
导出生产环境专用 BOM(安全审计用)
安全团队要的不是「哪些包装了」,而是「哪些包在运行时被加载、来自哪里、有无已知漏洞」。这时候 composer show --no-dev --format=json 是起点,但不够。
真正合规的 BOM 必须包含许可证、源类型、安装路径、哈希值——这些 composer show 不提供,得从 composer.lock 提取:
- 用
jq提取生产包:jq -r '.packages[] | select(.type != "project") | "\(.name) \(.version) \(.source.type // .dist.type) \(.license // "unknown")"' composer.lock - 必须同时记录
content-hash和hash字段,它们是 lock 文件完整性校验依据 - 别用
composer install --no-dev --dry-run模拟,那只是预估行为,不反映真实vendor/状态 - 如果项目用了私有 repo 或 platform config,
export --without-dev(Composer 2.4+)比手动过滤更可靠,它会重建依赖图并剔除所有 dev-only 子树
最容易被忽略的是:composer show 显示的是「已安装」,composer.lock 记录的是「应安装」,两者在 CI 环境中可能不一致——导出前务必确认 composer install 已成功执行且 vendor/ 完整。

















