license字段必须填SPDX官方标识符(如"MIT"),不能写自然语言、URL或大小写/拼写错误的变体;它不控制安装行为,但填错会导致Packagist不识别、CI扫描报unknown、企业镜像拒绝同步。

直接说结论:license字段必须填 SPDX 官方标识符(如"MIT"),不能写自然语言、URL 或大小写/拼写错误的变体;它不控制安装行为,但填错会导致 Packagist 不识别、CI 扫描报 unknown、企业镜像拒绝同步。
composer.json 里 license 字段填什么才合法
Composer v2.5+ 强制校验 license 值是否属于 SPDX License List 中的标准 ID。填错会触发 composer validate 报错,或被 Packagist 拒绝收录。
-
"MIT"✅(注意:不是"mit"、"MIT License"、"The MIT License") -
"Apache-2.0"✅(中间是短横,不是下划线或空格) -
"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 解析失败) -
{"type": "MIT"}❌(非法 JSON 类型,必须是字符串或字符串数组)
为什么改了 license 字段,Packagist 还显示 ❓
Packagist 只在你 push 新 tag 或触发 reindex 后重新解析 composer.json。显示 ❓ 的真实原因几乎全是字段值本身不合法,而非缓存问题。
- 运行
composer validate—— 它会本地检查 SPDX 合法性(不联网),失败即说明值不对 - 执行
composer show --no-dev --licenses your/package-name—— 看输出是否为预期值,不是???或UNLICENSED - 发布后访问
https://packagist.org/packages/your/vendor-your-package—— 右上角图标和文字必须与你填的完全一致 - 常见隐形坑:
"license": "MIT"写在require或autoload对象里(必须在根级);.gitignore误拦了composer.json导致 Packagist 读到旧版
license 字段和 LICENSE 文件必须配对
license 字段只是声明,真正起法律效力的是项目根目录下的 LICENSE 或 LICENSE.md 文件。两者不一致时,合规工具(如 Snyk、FOSSA)会直接标为“信息冲突”。
- 选
"MIT"→ 必须有LICENSE(无后缀)或LICENSE.md,内容为完整 MIT 模板(含版权年份、作者) - 用
curl -sL https://raw.githubusercontent.com/spdx/license-list-data/master/text/MIT.txt > LICENSE最稳妥 - 文件名大小写敏感:
license.md(小写 l)不被 GitHub/Packagist 识别 - 私有项目也建议放
LICENSE文件,哪怕内容只有一行:Copyright (c) 2026 Your Company. All rights reserved. Proprietary. - 别用 Word 或富文本编辑器保存 LICENSE —— 全角空格、中文引号、自动换行都会让扫描器失效
CI/CD 中怎么防住 license 填错
靠人工 review 容易漏,尤其 PR 模板没约束时。真正在意合规的团队会在 CI 里加一层校验。
- 加
composer validate到 lint 阶段 —— 它会捕获绝大多数拼写/格式错误 - 用
composer show --no-dev --format=json | jq -r '.[].license // ["UNLICENSED"] | .[]'提取所有 license 值,再用grep -qE '^(MIT|Apache-2.0|BSD-3-Clause)$'过滤 - 若需拦截非合规依赖(如禁用 GPL),启用
composer audit --no-dev(Composer 2.5+ 内置),配合--format=json | jq提取高危项 - 避免硬编码:
"license": "${LICENSE:-proprietary}"配合sed或jq注入环境变量,适配不同发布场景
最麻烦的从来不是怎么填对,而是改了 LICENSE 文件却忘了同步 license 字段,或者多人协作时有人手抖删了连字符——这类错误不会报错,只会在审计那天突然浮出水面。


















