license 字段必须使用 SPDX 官方标识符,单许可证用字符串(如"MIT"),多许可证用数组(如["MIT","GPL-3.0-or-later"]),闭源用"proprietary";值须在 composer.json 根级,且需配套标准 LICENSE 文件。

license 字段必须填 SPDX 官方标识符,否则 Packagist 不识别、CI 扫描报“unknown”、企业采购直接拒收。
license 字段值必须是 SPDX 标准字符串或数组
Composer 不接受自由文本、缩写、带空格或大小写错误的写法。它只认 SPDX License Identifier 列表里的精确值。
- 单许可证:用字符串,如
"MIT"、"Apache-2.0"、"GPL-3.0-only"—— 注意连字符、版本后缀、大小写全敏感 - 多许可证(“可任选其一”):用数组,如
["MIT", "GPL-3.0-or-later"];不能写成"MIT OR GPL-3.0"或["MIT or GPL-3.0"] - 闭源/内部工具:只能用
"proprietary";"internal"、"company"、"unlicensed"会被多数扫描器标记为风险项 - 绝对避免:
"MIT License"、"apache2"、"BSD"(不明确)、"MIT "(尾部空格)、null、{}、["MIT"](单值误写成数组)
composer.json 里 license 必须在根级,且不能有语法错误
字段位置错、格式错、类型错,Packagist 就当它不存在——页面显示 ❓,API 返回 null,搜索 license:MIT 找不到你的包。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须写在
composer.json最外层对象中,和name、description同级 - 不能塞进
require、autoload、scripts等子对象里 - 值只能是字符串或字符串数组;
"license": {"type": "MIT"}是非法 JSON,会静默失效 - 编辑完建议用
composer validate检查语法,它会提示license字段是否被识别
license 字段只是声明,真正起效的是 LICENSE 文件
license 字段本身没有法律效力,也不参与安装逻辑。合规工具(Snyk、FOSSA、企业镜像)最终校验的是项目根目录是否存在标准命名的协议正文文件。
- 必须存在
LICENSE(无后缀)或LICENSE.md,且内容是对应 SPDX 协议的完整原文 - 不能是
license.txt、License(首字母小写)、LICENSE.php—— 大小写和后缀都必须严格匹配 - 如果
license填了"GPL-3.0-or-later",但LICENSE里贴的是 GPL-2.0 文本,会被判定为冲突 - 文件必须提交进 Git,不能被
.gitignore拦截;CI 流程里可加一步检查:test -f LICENSE || (echo "LICENSE missing"; exit 1)
多许可证、私有包、自动化流程里的典型陷阱
这些场景下出错率最高,而且往往上线后才暴露。
- 多许可证不是“同时满足”,而是“二选一”——所以
["MIT", "Apache-2.0"]表示使用者可自行选择按哪个协议使用,LICENSE文件里得写清楚这种关系 - 私有包填
"proprietary"是正确做法,不填反而更危险:不填 = “许可证未知”,很多企业 Composer 镜像策略默认拦截 - CI/CD 自动生成
composer.json时,别硬编码"license": "MIT";改用模板变量,比如"license": "${LICENSE:-proprietary}",再用jq或envsubst注入 - 运行
composer licenses查依赖许可证时,注意它只读已安装包的composer.json;如果某个依赖 fork 自私有仓库且没申明license,结果会标为UNLICENSED,必须人工核查源码库
最常被忽略的一点:SPDX 标识符不是“差不多就行”。AGPL-3.0-only ≠ AGPL-3.0,BSD-3-Clause ≠ BSD-3,差一个字符,整个许可证就被识别失败。

















