Composer 的 license 字段是元数据,仅用于描述且须置于 composer.json 根级;单许可证用字符串(如 "MIT"),多许可证用数组(如 ["MIT", "Apache-2.0"]);Packagist 仅在字段合法且已索引时显示;该字段无法律效力,真实授权依赖 LICENSE 文件、SPDX 注释及分发内容。

Composer 项目许可证声明不是靠单独配置某个 license 键“生效”的,它本质是 composer.json 中一个**元数据字段**,仅用于描述、归档和生态协作,不参与依赖解析、安装或运行时行为。
license 字段写在哪、怎么写才被识别
必须写在 composer.json 的根级(顶层)对象中,键名为 license,值为字符串或字符串数组:
- 单许可证:用字符串,如
"MIT"、"Apache-2.0"、"GPL-3.0-only" - 多许可证(“或”关系):用数组,如
["MIT", "GPL-3.0-or-later"];注意不能写成"MIT OR GPL-3.0"这类自由文本 - 非标准许可证:可写
"proprietary"或自定义字符串(如"Custom-Commercial"),但 Packagist 不会验证其合法性,也不提供 SPDX 映射
示例片段:
{
"name": "acme/utils",
"description": "Helper functions",
"license": ["MIT", "Apache-2.0"]
}
为什么 packagist.org 上看不到 license?
Packagist 仅显示 composer.json 中的 license 字段,但前提是:
- 该字段存在且格式合法(字符串或字符串数组)
- 包已成功提交并被索引(新提交可能延迟几分钟)
- 没有因语法错误导致整个
composer.json解析失败(可用composer validate检查)
常见失效原因:"license": "MIT "(尾部空格)、"license": null、"license": {}、或把 license 写在 require 或 autoload 下面——这些都会让 Packagist 忽略该字段。
license 和实际法律效力的关系
license 字段本身不生成 LICENSE 文件,也不自动添加头部注释。它只是声明,真正的法律约束力来自:
- 项目根目录是否存在对应名称的
LICENSE或LICENSE.md文件(内容需完整、无删减) - 代码文件中是否包含合规的 SPDX 标识(如
// SPDX-License-Identifier: MIT) - 分发方式(如 Packagist 下载 zip 包是否含 LICENSE 文件)
也就是说:只改 composer.json 里的 license,不放真实许可证文件,等于没授权。
最容易被忽略的是:SPDX 短标识符(如 MIT)必须与 SPDX 官方列表 严格一致,大小写敏感,带连字符的不能省略(AGPL-3.0-only ≠ AGPL-3.0)。










