composer licenses 不能直接列出全部依赖的许可证,仅显示顶层包的 license 字段值,不递归解析传递依赖、不读取实际 LICENSE 文件,也不校验 SPDX 合规性。

composer licenses 命令能直接列出所有依赖的许可证吗
不能直接列出全部,composer licenses 默认只显示顶层包(即你项目 composer.json 中声明的直接依赖)的许可证信息,不会递归展开整个依赖树。它本质上是读取每个包 composer.json 里的 license 字段并格式化输出,不解析 LICENSE 文件或做 SPDX 校验。
常见错误现象:composer licenses 输出为空、或只看到几个包、或显示 proprietary 却不确定是否合规。
- 使用场景:审计第三方组件合规性、确认能否用于闭源商用、排查
MITvsGPL混用风险 - 参数差异:
composer licenses --tree会按依赖层级缩进显示,但依然不包含传递依赖的 license 字段(Composer 2.5+ 才支持该参数,旧版忽略) - 性能影响:无明显开销,纯本地 JSON 解析;但若项目依赖极多(>500),终端渲染可能卡顿
- 兼容性注意:Composer 1.x 不支持
--tree;某些包的license字段写的是BSD-2-Clause,而 SPDX ID 实际应为BSD-2-Clause(大小写敏感),部分工具会因此识别失败
怎么查某个具体包的实际许可证文件内容
composer licenses 只读 composer.json,不读磁盘上的 LICENSE 或 LICENSE.md。要确认真实条款,得手动进 vendor 目录看文件。
- 先定位包路径:
composer show vendor/package-name查versions和source,或直接看vendor/vendor/package-name/ - 检查常见许可证文件名:
LICENSE、LICENSE.md、LICENSE.txt、COPYING(尤其 GNU 系列) - 注意陷阱:有些包在
composer.json写"license": "MIT",但实际 LICENSE 文件被删了,或内容被篡改;也有的包把完整条款放在docs/下,composer.json却没更新 - 自动化辅助:可用
find vendor -name 'LICENSE*' | head -20快速扫一遍,但别全信——得人工核对内容是否匹配 SPDX ID
为什么 composer show vendor/package 输出的 license 字段有时是空的
因为该字段完全取决于包作者是否在自己的 composer.json 里写了 license,没有强制要求,也不校验合法性。
- 常见原因:包作者漏填、填了非标准值(如
"license": "See LICENSE file")、用了 Composer 不识别的 SPDX 别名(如Apache2而非Apache-2.0) - 解决方案:
composer show vendor/package --all看原始 JSON,确认license键是否存在;再结合上一步手动查 LICENSE 文件 - 兼容性影响:某些企业合规扫描工具(如 FOSSA、Snyk)会 fallback 到文件内容识别,但
composer licenses不会——它只认这个字段
有没有更可靠的批量许可证检查方式
靠 composer licenses 单命令不够,必须组合外部工具和人工验证。
- 用
composer show --format=json导出所有包元数据,再用脚本提取license字段 + 对应路径,批量grep -i "copyright\|permission\|grant"初筛 - 推荐轻量工具:
license-checker(Node.js,支持 PHP 包扫描)、pip-licenses(虽为 Python 设计,但可配合composer show --format=json输出做二次处理) - 关键提醒:SPDX 官方不认可
proprietary或unlicensed这类值;遇到这些,必须人工打开源码库看 LICENSE 文件,否则合规评审过不了 - 容易被忽略的点:dev-dependencies 的许可证也要审(比如测试用的
phpunit/phpunit是 MIT,但某些 mock 工具可能是 GPL)











