composer licenses 命令不存在,唯一可靠方式是用 composer show 读取 vendor/ 中已安装包的 composer.json license 字段,支持通配符和 JSON 输出,但需注意字段值不校验、不解析 LICENSE 文件,且非 SPDX 规范。

composer licenses 不是协议,也不是 Composer 原生命令——它在绝大多数真实环境中根本不存在。你运行它,大概率看到 Command "licenses" is not defined.,这不是配置问题,而是官方从未实现该命令。
composer show 是唯一稳定、无需插件的许可证元数据来源
composer show 读取的是本地 vendor/ 下已安装包的 composer.json 中 license 字段,不查网络、不依赖插件、不解析 LICENSE 文件,结果最可控。
- 必须先执行过
composer install或composer update,否则vendor/为空,composer show monolog/monolog会报Package not found - 支持通配符:如
composer show monolog/*可一次列出整个 monolog 生态 -
license字段值可能是字符串("MIT")、数组(["MIT", "Apache-2.0"])、空值、"proprietary",甚至"SEE LICENSE IN LICENSE.md"——composer show全部原样输出,不做归一化 - 不处理传递依赖:只覆盖
composer.json中显式声明的包,symfony/polyfill-intl-idn这类子依赖不会出现
--format=json + jq 是批量提取的唯一可靠路径
用文本管道(如 grep + awk)解析 composer show 的默认输出极易错行、漏字段、误判多 license 场景。机器可读必须走 JSON。
- 正确示例:
composer show --no-dev --format=json | jq -r '.packages[] | "(.name)\t(.version)\t(.license // ["unknown"] | join(" | "))"' - 注意:顶层是数组,不是对象;多 license 保留为数组,不要硬
join(" OR ")——SPDX 规范要求逻辑连接符必须显式写为OR/AND,数组本身才是原始事实 - 若没装
jq,可用 PHP 脚本替代:json_decode(file_get_contents('composer.lock'), true)读锁文件,对$pkg['license'] ?? ['unknown']强转数组再展开
license 字段只是线索,不是法律依据
看到 "license": "MIT" 不代表合规,这个字段由包作者自由填写,无强制校验,也不保证与实际 LICENSE 文件内容一致。
-
"MIT License"、"The MIT License"、"mit"都不是有效 SPDX 标识符;合规工具只认MIT - 遇到
"SEE LICENSE IN LICENSE.md",composer show绝不会自动读取该文件——你得手动打开对应包的LICENSE.md核对全文 -
GPL-2.0-only和GPL-2.0-or-later法律效力完全不同,但composer show不区分,也不会提示 - 空值、
"unlicensed"、"proprietary"必须立刻标记——它们意味着法律盲区,不能靠“大概率是 MIT”跳过
真正需要商用、出口或过等保时,跳过源码仓库中 LICENSE 文件的正则匹配(比如 grep -r -i "GNU GENERAL PUBLIC LICENSE.*v3" vendor/),后面补的成本远高于多花十分钟。











