直接运行 composer licenses 即可输出所有已安装包的许可证清单,该命令内置于 composer 2.2+,支持 json/markdown/text 格式,可结合 --no-dev 和 jq 筛查 gpl 类传染性许可证,亦可通过 composer show --format=json 提前基于 lock 文件检查,遇 multiple 或 unknown 必须人工核查源码仓库原始声明。

composer install 后怎么立刻拿到许可证清单
直接运行 composer licenses 就能输出所有已安装包的许可证类型和链接。这个命令是 Composer 内置的,不需要额外插件,但只在 2.2+ 版本可用;低于这个版本会报错 Command "licenses" is not defined。
常见错误是以为要先写配置或加插件——其实不用。只要 Composer 版本够新,composer install 或 composer update 完成后,紧接着跑这句就行:
composer licenses --format=json > licenses.json
这样导出结构化数据,方便后续做合规比对。注意:--format=markdown 和 --format=text 也支持,但 JSON 最适合自动化处理。
如何过滤掉 MIT/Apache-2.0 这类宽松许可证
默认输出包含所有包,但法务真正关心的是 GPL、AGPL、SSPL 这类传染性许可证。用 --no-dev 排除开发依赖后,再配合 grep 或 jq 精准筛选:
composer licenses --no-dev --format=json | jq -r '.[] | select(.license | contains("GPL") or contains("AGPL") or contains("SSPL")) | "\(.name) \(.license)"'- 如果项目里用了私有包且没声明 license 字段,
composer licenses会显示unknown——这类必须人工确认,不能跳过 - 有些包在
composer.json里写的是"license": "proprietary",它不等于闭源合规,只是表示“非 OSI 认证许可证”,得看实际授权文本
vendor 目录没生成时能不能提前检查许可证风险
可以。用 composer show --format=json 拿到锁文件中所有包的元信息,再解析 license 字段。比等 vendor/ 下载完再扫快得多,尤其适合 CI 流程早期卡点:
composer show --format=json | jq -r '.[] | select(.license | contains("GPL")) | .name'
注意两点:
-
composer show读的是composer.lock,不是composer.json,所以结果真实反映即将安装的版本 - 某些包(比如
symfony/flex)在 lock 文件里 license 是空数组[],jq 会跳过——这不是漏报,是它真没填,得去 GitHub 查composer.json原文 - 这个方法不依赖 vendor 目录存在,但要求 lock 文件已提交且可信
为什么有的包许可证显示为 multiple 或 array
Composer 允许在 composer.json 里写多个许可证,比如 "license": ["MIT", "GPL-2.0-or-later"],这时 composer licenses 会显示 multiple,而不是具体列表。
这意味着你必须逐个确认每个许可证是否被组织政策允许。常见坑点:
- 显示
multiple的包,不能只看第一个许可证就下结论——比如["MIT", "GPL-3.0"],MIT 部分无害,但 GPL-3.0 部分可能触发分发义务 - 有些包用
OR表达选择关系(如"GPL-2.0-or-later"),有些用AND(如同时满足 MIT + Apache-2.0),Composer 不区分语义,全当并列处理 - 遇到
multiple,最稳妥做法是去该包的 GitHub 主页翻原始composer.json,看 license 字段原文
许可证不是字符串匹配游戏,关键在法律效力。看到 multiple 或 unknown 时,别急着打勾,先打开源码仓库看一眼原始声明。










