composer show --licenses 输出每包名称、版本和协议三列空格分隔的纯文本,无表头、无json格式、不支持结构化解析;仅显示已安装依赖,协议字段可能含空格,需用正则或sed提取并归一化处理。

composer show --licenses 会输出什么格式?
这个命令实际输出的是每包的名称、版本和协议三列文本,用空格分隔,但协议字段可能含空格(比如 “BSD-2-Clause” 或 “MIT License”),所以不能简单按空格切分。更关键的是,它不输出表头,且未安装的包不会显示——也就是说,只统计 vendor/ 中已安装的依赖。
- 输出示例:
monolog/monolog 2.10.0 MIT - 若协议含空格(如
doctrine/annotations 1.14.3 Apache License, Version 2.0),最后一段才是协议名,前面所有字段都属于包信息 - 不支持 JSON 输出,无法直接 pipe 给 jq 处理
怎么可靠提取协议字段并去重归类?
得靠 shell 字符串处理,核心思路是:从右往左取最后一个“非空格连续段”作为协议名,再统一小写、去首尾空格、合并常见别名(如 MIT 和 MIT License 视为同一类)。
- 用
awk '{print $NF}'提取每行末字段,基本可用,但对Apache License, Version 2.0这种仍会截断成2.0 - 更稳妥做法是用
sed -E 's/^[^ ]+ [^ ]+ //'去掉前两列(包名 + 版本),剩下就是协议(需确认 composer 版本 ≥ 2.2,否则部分包可能只有两列) - 建议加
| sed 's/^[[:space:]]<em>//; s/[[:space:]]</em>$//'清理空格 - 常见需合并的协议别名:
MIT≈MIT License≈MIT license;BSD-2-Clause≈BSD 2-Clause
一行命令跑出占比统计
以下命令在项目根目录运行,输出协议名及出现次数(已去重归一化):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer show --licenses 2>/dev/null | sed -E 's/^[^ ]+ [^ ]+ //' | sed 's/^[[:space:]]*//; s/[[:space:]]*$//' | awk 'tolower($0) ~ /^mit( license)?$/ {print "MIT"; next} tolower($0) ~ /^bsd[ -]?2[ -]?clause$/ {print "BSD-2-Clause"; next} tolower($0) ~ /^apache.*2\.0$/ {print "Apache-2.0"; next} tolower($0) ~ /^mit|bsd|apache|gpl|lgpl|mpl|unlicense|cc0/i {print toupper($0)}' | sort | uniq -c | sort -nr
-
2>/dev/null屏蔽警告(如某些包无 license 字段) - 最后两列分别是计数和协议名,可手动换算百分比
- 注意:该命令不处理嵌套依赖中重复出现的同一协议(比如多个包都用 MIT,会分别计数,这是合理行为)
为什么不能直接信任 composer.lock 里的 license 字段?
composer.lock 中的 license 是数组,可能为空、为字符串("MIT")、或为数组(["MIT", "GPL-2.0"])。直接解析 JSON 容易漏掉多协议情况,且 Composer 并不保证所有包都填了该字段——很多包在 composer.json 里根本没写 license,composer show --licenses 却能 fallback 到 vendor/<em>/</em>/composer.json 实际读取,更准确。
-
composer show --licenses是唯一官方支持的协议查询方式 - 若某包 license 为空,
composer show会显示UNKNOWN,需人工核查 - 遇到
UNKNOWN较多时,说明项目依赖管理较松散,协议合规风险更高
协议字段本身模糊、别名混乱、大小写不敏感、多协议共存——这些不是命令能自动解决的,最终仍需人工复核关键依赖的原始 composer.json 或 LICENSE 文件。










