license字段必须使用SPDX官方标识符,单协议写字符串(如"MIT"),多协议写数组(如["MIT","Apache-2.0"]),闭源用"proprietary";须与根目录LICENSE文件内容严格一致,否则Packagist显示❓、CI报unknown、企业拒收。

composer.json 里的 license 字段只声明,不执行;填错不会让 composer install 失败,但会让 Packagist 显示 ❓、CI 扫描报 unknown、企业镜像直接拒收——它必须是 SPDX 官方列表里的标准 ID,且大小写、连字符、后缀一个都不能错。
license 字段怎么写才合法(SPDX 校验级)
Composer v2.5+ 本地运行 composer validate 就会校验 license 是否属于 SPDX License List。非法值当场报错,不是“可能有问题”,而是“根本通不过”。
-
"MIT"✅(全大写,无空格,无后缀);"mit"在部分版本也过,但 Packagist 显示和 CI 工具倾向用大写,统一写"MIT"最稳 -
"Apache-2.0"✅(中间是短横,不是下划线或空格;不能写"Apache 2.0"或"apache2") -
"GPL-3.0-or-later"✅(-or-later不可省;"GPL-3.0"表示严格锁定 v3,语义不同) -
["MIT", "BSD-3-Clause"]✅(多协议表示“任选其一”,必须用数组;不用"MIT OR BSD-3-Clause"这类字符串表达式) -
"proprietary"✅(闭源项目唯一推荐值;"internal"、"company"、"closed"全部非法) -
"BSD"❌(SPDX 不认模糊缩写,必须明确写成"BSD-2-Clause"或"BSD-3-Clause") -
"MIT "❌(尾部空格导致 JSON 解析失败,composer validate直接报错) -
{"type": "MIT"}❌(必须是字符串或字符串数组,不能是对象)
为什么改了 license,Packagist 还显示 ❓
Packagist 不读你 push 到 main 分支的最新 composer.json,它只抓取 tag 对应的 commit。显示 ❓ 的真实原因 99% 是字段本身不合法,不是缓存没刷新。
- 确认你打的是新 tag(如
v1.4.0),不是只git push origin main - 用
git show v1.4.0:composer.json | grep license检查该 tag 下的composer.json是否真有正确值 - 访问 https://www.php.cn/link/2171a9b7a83660dc1f75c463d234dc66,看右上角 “Last updated” 时间是否已更新;滞后就点页面上的 “Update” 手动触发同步
- 检查 .gitignore 是否误拦了
composer.json(常见于团队模板里加了composer.*)
config.license 白名单怎么配才生效
config.license 是白名单配置路径,但它默认完全不生效——必须配合 --strict-licenses 参数才启动校验逻辑。光写配置,不加参数,等于没写。
- 正确写法:
{ "config": { "license": ["MIT", "Apache-2.0", "BSD-3-Clause"] } } - 错误写法:
"license": ["MIT"]放在根级(那是声明你自己的协议,不是白名单) - 启用方式只有两种:
composer install --strict-licenses或composer update --strict-licenses - 匹配规则是“至少一个匹配”:依赖包写
"license": ["GPL-2.0-only", "MIT"],只要白名单含"MIT"就放行 -
"proprietary"和"unlicensed"永远不匹配任何开源白名单,别指望它们能绕过检查 - 大小写敏感:
"mit"在某些 Composer 版本不被识别,坚持用"MIT"
license 字段和 LICENSE 文件必须双一致
license 字段只是元数据,法律效力来自项目根目录的 LICENSE 或 LICENSE.md 文件内容。Packagist 和合规工具会交叉比对二者是否一致。
- 填了
"MIT",但 LICENSE 文件里是 GPL-3.0 文本?会被标为许可证冲突 - 多协议项目(如 MIT 或 Apache-2.0)要写成
["MIT", "Apache-2.0"],同时 LICENSE 文件开头需注明“you may choose either...” - 私有包也必须填
"proprietary",不填 ≠ 无协议,而是 ≡ 未知协议,很多企业镜像策略直接拒绝安装 - Composer 不解析 LICENSE 文件内容,也不校验文本是否完整——这是人工或专用扫描工具(如 FOSSA、Snyk)的事
最容易被忽略的是:SPDX ID 必须和官方列表逐字符一致,连末尾空格都会让 composer validate 失败;而 Packagist 同步只认 tag,改完 composer.json 不打 tag,等于什么都没做。


















