composer.json 的 license 字段仅声明本项目自身协议,必须用 spdx 标准标识符(如 "mit"),不影响依赖行为;依赖协议由其各自 composer.json 定义,协议兼容性需人工或工具审计。

composer.json 本身不支持设置“全局默认项目协议”,协议声明仅对当前项目生效,且只用于描述本项目自身所采用的开源许可证,不是 Composer 的行为配置项。
composer.json 中 license 字段怎么填
这是唯一合法的协议声明位置,作用是向使用者和包管理器说明本项目的法律许可方式:
- 必须是 SPDX 认可的标准化标识符,比如
"MIT"、"Apache-2.0"、"GPL-3.0-or-later",不能写成"MIT License"或"see LICENSE file" - 值为字符串(单个协议)或字符串数组(多重许可),例如:
"license": ["BSD-3-Clause", "GPL-2.0-or-later"] - 该字段不影响
composer install或依赖下载行为,也不控制依赖包的协议检查 - 如果留空或缺失,Packagist 会标为 “Unknown”,部分合规扫描工具可能报警告
为什么改了 license 字段,依赖包还是用 MIT 或 GPL?
因为 composer.json 的 license 字段只描述当前项目自身,和它所依赖的包无关。每个依赖包的协议由其自己的 composer.json 中的 license 字段定义:
- Composer 不强制依赖协议兼容性(例如你项目用 GPL,却引入 MIT 包,不会报错)
- 协议冲突需人工识别,可用工具如
composer normalize+license-checker辅助审计 - 想限制依赖协议类型?得靠外部策略工具(如
php-scoper配合自定义规则,或 CI 中跑spdx-license-matcher)
有没有办法让新项目自动带 license 字段?
Composer 本身无模板机制,但可通过以下方式间接实现:
- 用
composer create-project基于自定义 skeleton 仓库初始化,该 skeleton 的composer.json已预置"license": "MIT" - 配合
composer init交互式创建时,手动输入协议(它会校验 SPDX ID,输错会提示) - 团队内统一用脚本生成初始
composer.json,例如:echo '{"license":"MPL-2.0","autoload":{"psr-4":{"App\\":"src/"}}}' | jq . > composer.json - 注意:IDE 模板或 Git hooks 可自动化注入,但无法绕过 Packagist 对协议字段的校验逻辑
真正容易被忽略的是:协议字段不参与依赖解析,也不触发任何自动行为;它的价值完全体现在法律披露、合规审计和人类可读性上。填错 SPDX ID 可能导致自动化合规流程中断,但不会让 composer install 失败。










