composer licenses 命令仅显示项目顶层包的 license 字段值,不递归扫描依赖;完整许可证信息需用 composer show --format=json 配合 jq 解析,但 license 字段可能缺失、模糊或不规范,最终应以源码中的 LICENSE 文件为准。

composer licenses 命令本身不输出完整许可证列表
直接运行 composer licenses 只会显示顶层包(即你的项目)的 license 字段值,**不是所有依赖的许可证汇总**。它不递归扫描 vendor 目录,也不解析 composer.json 中每个依赖的 license 字段。这是最常被误解的一点——命令名有误导性,实际功能非常有限。
用 composer show --format=json 获取全部依赖许可证
真正能批量提取许可证信息的方式是结合 composer show 的 JSON 输出和轻量解析。它会列出所有已安装依赖及其元数据,其中 license 字段就在每个包对象里:
composer show --format=json | jq -r '.packages[] | select(.license != null) | "\(.name) \(.version) \(.license | join(", "))"'
说明:
-
jq是必需的命令行 JSON 处理工具(macOS/Linux 通常需brew install jq或apt install jq;Windows 可用jq-win64.exe) -
select(.license != null)过滤掉没声明 license 的包(避免空值干扰) -
join(", ")处理一个包声明多个许可证的情况(如["MIT", "Apache-2.0"]) - 输出形如:
monolog/monolog 2.10.0 MIT或symfony/console 6.4.0 MIT, Apache-2.0
注意 license 字段可能缺失、模糊或不规范
Composer 不强制要求包作者填写 license,也不校验值是否符合 SPDX 标准。常见问题包括:
-
"license": "proprietary"或"license": "unlicensed"—— 无法自动判断合规风险,需人工核查 -
"license": "BSD"—— 没写具体版本(2-clause?3-clause?),SPDX 推荐用BSD-2-Clause -
"license": "see LICENSE file"—— 字符串无意义,必须去对应包的LICENSE文件看原文 - 私有包或 fork 包可能完全没填 license 字段,
composer show就不会出现在结果里
自动化合规检查建议用专用工具
靠 shell + jq 做初筛可以,但真要落地合规流程(比如生成报告、拦截高风险许可证、对接 CI),推荐用更健壮的工具:
-
composer-license-checker:专为 PHP 项目设计,支持白名单、黑名单、导出 CSV/HTML 报告 -
FOSSA或Black Duck:商业方案,支持跨语言、SBOM 生成、漏洞联动 - 自建脚本时,别只依赖
license字段 —— 应同时读取每个包根目录下的LICENSE、LICENSE.md或COPYING文件内容做正则匹配(例如识别 “GNU GENERAL PUBLIC LICENSE Version 3”)
许可证字段只是线索,最终以源码附带的许可证文本为准。很多法律团队拒绝接受仅基于 composer.json 的结论。










