Composer 无 license 子命令,需用 composer show 查看包 license 字段;批量导出需结合 --format=json、jq 等工具;合规审计应依赖 license-checker 或 FOSSA 等专用工具。

Composer 本身没有 license 子命令,composer license 会直接报错:「Command "license" is not defined.」——这是最常被误解的一点。
为什么找不到 composer license 命令
Composer 核心命令中从不存在 license。官方只提供 composer show(或缩写 composer info)来查看包元数据,其中包含 license 字段。想批量检查协议,必须靠组合命令或外部工具。
-
composer show --all仅显示已安装包,不含 require-dev 中的开发依赖(除非加--dev) - 包的
license字段可能为MIT、Apache-2.0、proprietary,也可能为空或模糊值如BSD-3-Clause(注意大小写和连字符变体) - 某些包在
composer.json中声明"license": "UNLICENSED"或"license": "GPL-2.0-only",但未在 Packagist 上同步,本地show结果可能滞后
用 composer show 手动检查单个包的协议
最轻量的方式是查具体包,适合快速验证可疑依赖:
composer show monolog/monolog | grep license
输出类似:license MIT。但注意:
- 必须确保该包已通过
composer install下载到vendor/,否则show会报错「Package not found」 - 若包使用自定义仓库(如私有 GitLab),且未在
composer.json中配置repositories,show可能无法解析其 license 字段 - 有些包把协议写在
README.md或根目录LICENSE文件里,而composer.json的license字段为空——这时show查不到,得手动翻源码
用脚本批量提取所有依赖的 license 字段
真正做合规审计时,需要导出全量 license 清单。以下 Bash 脚本可生成 CSV(含包名、版本、协议):
composer show --format=json --no-dev | jq -r '.[] | "\(.name),\(.version),\(.license // "unknown")"' > licenses.csv
说明:
-
--no-dev排除开发依赖;如需包含,改用--dev -
jq是必需依赖,macOS 可用brew install jq,Linux 用apt install jq -
.license // "unknown"处理空值,避免字段缺失导致 CSV 错位 - 输出中的
license值仍需人工核对:比如BSD-3-Clause和BSD-3-Clause-Clear法律效力不同,不能简单归为「BSD」
真正可靠的开源协议合规检查靠专用工具
Composer 自带能力仅限于读取元数据,不校验协议兼容性(例如 MIT 依赖能否用于 GPL 项目)。生产环境应使用:
-
license-checker(Node.js 工具,支持解析composer.lock并比对 SPDX 协议列表) -
FOSSA或Snyk Advisor:上传composer.lock后自动识别冲突(如项目用 GPL-3.0,但某依赖是 Apache-2.0 + 专利授权例外) - PHP 项目也可用
php-scanner配合spdx-license-matcher库做本地扫描,但需自行写胶水代码
别指望靠 composer 命令行一步到位——license 字段只是声明,不是法律意见;实际合规要结合分发方式、修改程度、专利条款等上下文判断。










