如何使用Composer License查看项目依赖包的开源协议分布?

12次阅读

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

如何使用Composer 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 %dn", $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 文件。

text=ZqhQzanResources