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