composer show 不能直接当BOM用,因其仅显示顶层及直接依赖,缺失版本约束、来源、许可证、安装路径等关键字段,且为调试命令而非合规输出工具;官方推荐基于 composer.lock 解析生成结构化BOM。

composer show 生成的依赖树为什么不能直接当BOM用
因为 composer show 默认只显示顶层依赖和直接子依赖,且不包含版本约束、来源(dist vs source)、许可证、安装路径等BOM必需字段。它本质是调试命令,不是合规输出工具。
真正用于审计或交付的BOM需要完整、可解析、带元数据的结构化清单。官方推荐方式是导出 lock 文件 + 解析,而非靠命令行“人眼凑”。
用 composer show --format=json 导出全量依赖的实操要点
composer show --format=json 是最轻量但有效的BOM生成起点,它输出所有已安装包(含嵌套依赖)的 name、version、source/dist 信息,不含 license 字段,但可二次补全。
- 必须在项目根目录执行,且确保
vendor/已存在(即已运行过composer install) - 加
--locked参数可强制按composer.lock输出,避免因本地 vendor 状态不一致导致漏包 - 输出 JSON 是扁平结构(非树形),适合管道处理:例如
composer show --format=json --locked | jq '.[] | {name: .name, version: .version, source: .source}' > bom.json - 注意:PHP 8.2+ 的 Composer 2.5+ 才支持
--locked;旧版本需先composer install --no-dev再执行
从 composer.lock 提取BOM更可靠,但要注意三个关键字段
composer.lock 是权威来源,但直接读取 JSON 容易忽略语义细节。重点看这三个区块:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
packages:运行时依赖(含 dev 依赖,若需精简需过滤dev-*开头的 package name) -
packages-dev:仅开发依赖,合规BOM通常要排除(除非明确要求含 dev 工具链) -
hash和content-hash:必须记录,它们是 lock 文件完整性校验依据,缺失则BOM不可信
示例提取命令(排除 dev 包):jq -r '.packages[] | select(.type != "project") | "\(.name) \(.version) \(.source.type // .dist.type)"' composer.lock > bom-simple.txt
License字段缺失怎么办?别硬扒源码,优先查 packagist.org API
composer show 和 composer.lock 都不保证含 license 字段——Composer 不强制声明,很多包也确实没填。强行从 vendor/*/composer.json 里读,会遇到路径不一致、schema 变体多、MIT/Apache 拼写不统一等问题。
更稳的做法是批量调用 Packagist API 补全:
- 用
composer show --format=json --locked先拿到所有name和version - 对每个包请求
https://packagist.org/packages/{name}.json,取package.versions[version].license(注意:version 字符串需标准化,如dev-main要转成dev-main#abc123) - 缓存结果,避免触发 API 限流(Packagist 免费版约 60 请求/分钟)
许可证不是装饰项——安全审计、合规交付、SaaS 服务备案都卡这一条。宁可多花半小时补全,也不要交一份空 license 的BOM。

















