composer licenses 命令仅原样输出已安装包 composer.json 中的 license 字段值,不校验真实性、不解析 LICENSE 文件、不处理传递依赖;它只是元数据快照,非合规检查工具,法律审核必须人工核对源码仓库中的实际许可证文件。

composer licenses 命令在 Composer 2.2+ 中确实存在,但它只显示已安装包的 license 字段值,不校验真实性、不解析 LICENSE 文件、不处理传递依赖——它不是合规检查工具,只是元数据快照。
composer licenses 命令到底能做什么?
它读取 vendor/ 下每个已安装包的 composer.json 中的 license 字段,原样输出。支持 --format=json、--no-dev、--locked 等参数,但:
- 若没运行过
composer install或composer update,vendor/为空,命令直接报错 -
--locked模式下读的是composer.lock,但部分包(尤其是私有源或嵌套依赖)该字段可能为空或为 URL,jq解析时会跳过 - 遇到
"license": "SEE LICENSE IN LICENSE.md",它不会自动打开并读取该文件内容 - 对
proprietary、unlicensed、空值、unknown不做任何标记或警告
为什么不能靠它判断法律合规?
因为 license 字段是作者自由填写的字符串,Composer 不验证它是否与实际 LICENSE 文件一致,也不检查是否符合 SPDX 规范:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"MIT License"和"The MIT License"都不是有效 SPDX 标识符,只有MIT才被合规工具识别 -
GPL-2.0-only与GPL-2.0-or-later法律效力完全不同,但composer licenses全部当普通字符串输出,不提示差异 - 一个包在
composer.json写"license": "MIT",但源码里混入了 LGPL 文件——这个命令完全无法发现 - 私有 fork(如
"repositories": [{"type": "vcs", "url": "git@"}])常无license字段,composer licenses显示unknown,必须手动翻仓库根目录
真正可用的合规检查路径
自动化只能覆盖线索收集,关键判断必须人工介入:
- 先用
composer licenses --format=json --no-dev > licenses.json导出结构化数据 - 用
jq筛查高风险项:jq -r '.[] | select(.license | test("GPL|AGPL|LGPL|SSPL"; "i")) | "\(.name) \(.version) \(.license)"' licenses.json - 对
proprietary、unknown、SEE LICENSE IN ...类条目,必须点进对应包的 GitHub/GitLab 仓库,打开根目录LICENSE或LICENSE.md,全文匹配是否为标准 SPDX 许可证文本 - 用
spdx-licenses工具验证标识符有效性:composer require --dev spdx-licenses,再调用getLicenseByIdentifier("MIT")确认是否 OSI 认证、是否兼容 GPL - CI 中别信
composer audit——它根本不分析许可证,所谓 “License conflict” 是误标
最容易被忽略的三个实操细节
很多人卡在这几步上,导致法务审核退回:
-
composer show vendor/package-name和composer licenses输出的license值可能不一致:前者来自vendor/中已安装包的composer.json,后者在--locked模式下来自composer.lock,而 lock 文件里的字段可能未被作者填写 - 某些包(如
symfony/polyfill-*)在composer.lock里license字段为空数组[],jq默认跳过,你以为漏报,其实是作者根本没填 - 公司白名单通常按包名 + 版本号审批,
composer update后新版本若未重新走法务流程,旧豁免自动失效——这点没有任何命令能自动提醒

















