Composer无内置命令查看依赖许可证分布,需解析composer.lock:PHP脚本或jq可统计license字段(支持字符串/数组/null),但jq不处理缺失字段,且部分包license未同步需人工核查。

Composer 本身不提供直接查看依赖包许可证分布的命令,但可以通过解析 composer.lock 文件 + 少量脚本快速统计。核心思路是:读取锁文件中的 license 字段,按值归类计数。
为什么不能用 composer show --licenses?
该命令在较新版本 Composer(2.5+)中已被移除;旧版(如 1.x)虽存在,但输出格式混乱、不支持 JSON、无法聚合统计,且对多许可证(如 ["MIT", "Apache-2.0"])只显示第一个,信息严重丢失。
手动解析 composer.lock 最可靠
composer.lock 是标准 JSON,每个包条目含 license 字段,类型可能是字符串、字符串数组或 null。需统一处理这三种情况:
- 字符串(如
"MIT")→ 直接计入 - 数组(如
["BSD-3-Clause", "GPL-2.0-or-later"])→ 拆开逐个计入 -
null或缺失 → 计为"UNLICENSED"或跳过(建议标为"unknown")
推荐用 PHP 脚本(无需额外依赖,Composer 环境已具备):
#!/usr/bin/env php
$count) {
printf("%-25s %d\n", $lic, $count);
}
用 jq 快速一行统计(Linux/macOS)
如果你已安装 jq,可跳过写脚本,直接解析:
jq -r '.packages[].license | if type == "array" then .[] else . end | select(. != null and . != "")' composer.lock | sort | uniq -c | sort -nr
说明:
-
if type == "array" then .[] else . end展开数组并透传单值 -
select(. != null and . != "")过滤空值和空字符串 -
sort | uniq -c统计频次,sort -nr倒序排列
注意:jq 不处理 license 字段缺失(即不在 packages 条目里)的情况,所以结果略少于 PHP 脚本(后者还覆盖了 packages-dev 和根包自身)。
真正容易被忽略的是:有些包在 composer.json 中声明了 license,但实际发布到 Packagist 的版本未同步更新字段,导致 composer.lock 里仍是 null;此时仅靠自动化工具无法识别,必须人工查源码仓库的 LICENSE 文件。










