license字段必须填SPDX官方标识符如"MIT"或["MIT","GPL-3.0-or-later"],自定义协议只能用"proprietary",填错会导致composer install报错、CI失败及合规工具误判。

composer.json 里 license 字段填什么才合法
license 字段不是随便写个“MIT”或“Apache-2.0”就完事的——Composer 会校验它是否在 spdx/license-list 官方列表中(v2.0+ 强制),填错会导致 composer install 报错或 CI 拒绝通过。
- 必须用 SPDX License Identifier,比如
"MIT"、"Apache-2.0"、"GPL-3.0-only",不能写"MIT License"或"apache2" - 多个协议用数组:
["MIT", "GPL-3.0-or-later"],表示“可任选其一”,不是“同时满足” - 如果是自定义协议(如公司内部许可),只能填
"proprietary",其他字符串(包括"custom")会被 Composer v2+ 拒绝 - 别把 license 和
type搞混:"type": "library"不影响许可证语义,只用于包分类
为什么 vendor 包的 license 显示不全或报 warning
执行 composer show --licenses 时看到 ??? 或 UNLICENSED,通常不是你项目的问题,而是依赖包没规范声明 license —— Composer 只读取其 composer.json 中的 license 字段,不解析 LICENSE 文件内容。
- 第三方包漏填
license:常见于老旧包或个人小工具,你无法修复,但可用composer why-not vendor/package看是否真有合规风险 - 包写了
"license": "BSD"` 但没指定版本:SPDX 要求明确写成 <code>"BSD-2-Clause"或"BSD-3-Clause",否则视为无效 - 某些包用
"license": "BSD-3-Clause OR MIT"这种表达式:Composer 不支持逻辑运算符,只会当非法值处理,显示为???
如何让 composer install 自动拒绝含非合规 license 的包
靠默认行为不行。Composer 不拦截安装,只在 show --licenses 或 audit(需插件)时提示。真要卡住流程,得加约束。
- 用
composer config --global allow-plugins false防止自动加载不安全插件,但这和 license 无关 - 实际有效方式是配合
composer audit(Composer 2.5+ 内置):运行composer audit --no-dev --format=json | jq '.violations[] | select(.severity == "critical")'检查高危协议(如"AGPL-3.0-only"在闭源项目中可能触发法律风险) - CI 中建议加一步:
composer show --no-dev --format=json | jq -r '.[].license // ["UNLICENSED"] | .[]' | grep -qE '^(MIT|Apache-2.0|BSD-2-Clause|BSD-3-Clause)$' || (echo "non-compliant license found"; exit 1)
license 字段对 packagist.org 发布和自动分析的影响
Packagist 解析 composer.json 时,只认 license 字段值,且会据此打标签、排序搜索结果。填错不仅影响协作体验,还会导致自动 license 汇总工具(如 FOSSA、Snyk)误判。
- 填
"license": "MIT"后,Packagist 页面右上角显示 MIT 图标,API 返回字段license值也为"MIT" - 如果填了
"license": ["MIT", "GPL-3.0-or-later"],Packagist 只取第一个("MIT")作主标识,其余丢弃 —— 所以多协议项目务必把最宽松的那个放前面 - 某些扫描工具依赖 Packagist 元数据而非本地文件,因此即使你项目根目录有完整 LICENSE 文件,只要
composer.json里写的是"proprietary",工具仍会标记为“无开源协议”
license 不是装饰字段,它参与依赖链的合规传递。一个拼写错误,可能让法务团队在审计时多花两小时人工核对。










