推荐用composer show --direct --no-ansi | awk '{print $1 " " $2}' | sort -v导出扁平、去重、带版本、标明来源的可读bom清单,它只列直接依赖、按包名排序、版本对齐,适配安全评审与合规文档。

Composer 项目依赖怎么一键导出为可读清单?
直接用 composer show --tree 或 composer show --format=json 都不够干净——前者带缩进但难筛选,后者是 JSON 但没去重、没分层、不便于审计。真正能当物料清单(BOM)用的,得是扁平、去重、带版本、标明来源(require / require-dev)的纯文本列表。
推荐组合命令:
composer show --direct --no-ansi | awk '{print $1 " " $2}' | sort -V
这条命令只列出直接依赖(不含递归子依赖),按包名排序,版本号对齐,适合粘贴进安全评审表或合规文档。如果需要包含 require-dev 的全部依赖(含间接依赖),改用:
composer show --no-ansi | grep -E '^[a-z0-9\-]+/[a-z0-9\-]+' | awk '{print $1 " " $2}' | sort -u
注意:sort -u 会去重,但不同版本的同一包会被视为不同条目;若需强制保留最高版本,得加 sort -Vr | awk '!seen[$1]++' 去重并留最新版。
如何导出带依赖关系层级的结构化清单?
composer show --tree 看起来直观,但输出含 ANSI 色彩控制符、缩进用空格不统一、无法直接解析。实际自动化处理时,建议用 JSON 格式再加工:
composer show --tree --format=json | jq -r '.[] | "\(.name)@\(.version) | \(.requires | length) deps"'
这样每行一个包,附带其直接依赖数量,可用于快速识别“高耦合”组件。若要完整树形结构转为缩进文本(如供人工审阅),可用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer show --tree --no-ansi | sed 's/├── //; s/└── //; s/│ //g'
它清理掉 tree 图形符号,只留缩进空格,后续可用 Python 或 awk 按空格数判断层级。
导出清单时为什么 composer.lock 比 composer.json 更可靠?
composer.json 里写的可能是 "monolog/monolog": "^2.0" 这种模糊约束,而真正部署/构建时用的是 composer.lock 里锁定的具体 SHA 和版本。物料清单若用于安全扫描或 SBOM(Software Bill of Materials),必须基于 lock 文件。
从 composer.lock 提取最简清单的方法:
- 用
jq -r '.packages[] | "\(.name)@\(.version)@\(.dist.reference)"' composer.lock获取包名+精确版本+提交哈希 - 若需区分生产/开发依赖,
composer.lock不直接记录,得反查composer.json中的require和require-dev字段做映射 - 注意:有些包可能出现在
packages-dev数组里(Composer 2.2+),需同时解析该字段
生成 SBOM 兼容格式(CycloneDX)要避开哪些坑?
直接手写 CycloneDX XML 太重,推荐用社区工具 composer-plugin-cyclonedx。但它默认不包含许可证字段,且对私有仓库包的 dist.url 解析常为空——导致生成的 BOM 缺失关键元数据。
实操要点:
- 安装插件后运行
composer cyclonedx,但先确保所有包都已composer install完成(否则dist.url和license可能缺失) - 私有包若通过
artifact或package方式引入,需在composer.json中显式补全"license"字段,否则 CycloneDX 输出里 license 为UNKNOWN - 生成的
bom.xml默认不含哈希值;如需完整校验能力,得加参数--include-hashes(v2.2+ 支持)
真正难搞的不是导出动作本身,而是确保所有包的元数据(尤其是许可证和来源 URL)在 lock 文件里真实存在——这取决于你平时是否规范维护 composer.json 和私有仓库的 composer.json 发布质量。










