composer怎么导出依赖列表_composer licenses命令详解【合规】

1次阅读

composer licenses 命令导出的是各已安装包的 name、version 和 license 字段值(取自 composer.json),不校验真实性,不可用于法律合规审计,仅作快速参考。

composer怎么导出依赖列表_composer licenses命令详解【合规】

composer licenses 命令导出的是什么

composer licenses 不生成标准 SPDX 或 SBOM 格式清单,也不包含许可证全文,它只输出每个已安装包的 nameversionlicense 字段值(取自 composer.json 中的 license 键)。这个字段由包作者填写,可能为空、写错(比如填成 MIT 但实际没附 LICENSE 文件),甚至填成模糊值如 proprietaryunlicensed

所以它不能直接用于法律合规审计,仅适合快速扫一眼“用了哪些包、作者标称了什么许可”。

怎么用 composer licenses 导出可读的依赖+许可证列表

默认输出是表格形式,难进 CI 或做后续处理。加 --format=json--format=plain 才方便解析:

  • composer licenses --format=json > licenses.json:输出 JSON,含 nameversionlicensehomepage 等字段,适合脚本读取
  • composer licenses --format=plain > licenses.txt:纯文本制表符分隔,可用 awkexcel 打开
  • --no-dev 排除开发依赖,避免把 phpunit 这类工具计入最终分发清单
  • 注意:如果项目用了 path 类型仓库或 package 自定义包,license 字段必须手动在 composer.json 里补全,否则输出为空

为什么 composer licenses 显示的 license 值不可信

Composer 不校验许可证真实性,只原样读取 composer.json。常见问题包括:

  • 包作者写了 "license": "MIT",但项目根目录没有 LICENSE 文件,或文件内容与 MIT 不符
  • 用了 dev-masterdev-main 分支,composer.json 中的 license 可能过期,而 composer licenses 仍照搬旧值
  • 某些包(如私有包)设为 "license": "proprietary",但未提供任何使用条款,这在开源分发中属于高风险项
  • license 字段支持多值(如 "MIT", "apache-2.0"),但 composer licenses 输出时会合并成字符串,丢失结构,无法自动判断是否满足“强 copyleft”限制

真正合规需要补什么动作

composer licenses 是起点,不是终点。要满足常见开源合规要求(如 GPL 传染性检查、许可证兼容性判断),还得:

  • 对每个包,人工或用工具(如 FOSSASCANOSS)扫描源码,确认实际 LICENSE 文件存在且内容匹配
  • 识别出 GPL-2.0-onlyAGPL-3.0-only 等强限制许可证,评估是否允许在你的产品中使用
  • 注意 license 字段里的 OR / AND 关系——例如 "MIT OR Apache-2.0" 表示可任选其一,但 "MIT AND BSD-3-Clause" 需同时满足两者
  • 如果项目要打包分发,需额外收集每个包的完整 LICENSE 文本(composer licenses 完全不提供这个),通常得靠 composer install --no-dev && find vendor/ -name 'LICENSE*' -o -name 'COPYING*' 配合整理

许可证字段写得再整齐,代码里混进一个没声明的 GPL 模块,整份清单就失去意义。别只盯着 composer.json 看。

text=ZqhQzanResources