Composer的license字段仅为元数据声明,不触发任何行为;真正合规检查需显式启用--strict-licenses或使用composer audit配合jq解析,且LICENSE文件须手动创建并严格符合SPDX规范。

Composer 本身不提供 License 插件,也没有官方“集成 License 插件”这回事 —— 所有声称能自动检查、拦截或生成 LICENSE 的 Composer 插件,都是第三方扩展,且多数已废弃或不维护。
composer.json 里 license 字段只是元数据,不触发任何行为
你填 "license": "MIT" 或 "license": ["MIT", "Apache-2.0"],只会影响 Packagist 页面显示、composer show --licenses 输出和部分扫描工具识别。它不会:
- 自动生成
LICENSE文件 - 阻止安装含 GPL 的依赖
- 校验你自己的代码是否符合该协议
- 在
composer install时做任何许可证判断
这个字段纯属声明用途,法律效力为零。真要管合规,得靠外部机制。
真正起作用的 license 检查必须显式启用 --strict-licenses
Composer 2.5+ 内置了基础许可证白名单校验能力,但默认关闭。启用方式只有两种:
- 运行命令时加参数:
composer install --strict-licenses或composer update --strict-licenses - 在
composer.json中配置白名单:"config": { "license": ["MIT", "Apache-2.0"] }(注意路径是config.license,不是顶层license)
关键点:
- 没加
--strict-licenses,config.license完全无效 - SPDX ID 大小写敏感:
"mit"可以,"MIT"在某些版本会失败 -
"proprietary"和"unlicensed"永远不匹配任何开源白名单 - 依赖包的
license字段只要有一个值落在白名单里,就算通过(宽松 OR 匹配)
想自动检测高危协议?用 composer audit + jq
composer audit 是 Composer 2.5+ 内置命令,但它默认只报 security 漏洞,不报 license 风险 —— 除非你手动解析 JSON 输出:
composer audit --no-dev --format=json | jq '.violations[] | select(.severity == "critical") | select(.type == "license")'
常见高危协议包括:"AGPL-3.0-only"、"GPL-3.0-only"、"CC-BY-SA-4.0"。它们在闭源项目中可能触发传染性开源义务。
CI 中更稳妥的做法是直接扫依赖声明:
composer show --no-dev --format=json | jq -r '.[].license // ["UNLICENSED"] | .[]' | grep -qE '^(MIT|Apache-2.0|BSD-3-Clause)$' || (echo "non-compliant license found"; exit 1)
注意:grep -qE 匹配的是 SPDX ID 字符串,不是自然语言描述;写成 "The MIT License" 就会漏检。
LICENSE 文件必须手动生成,且格式极其敏感
Composer 不读、不写、不校验磁盘上的 LICENSE 文件 —— 但它被所有 FOSS 扫描器(FOSSA、Snyk、GitHub License Detection)当作法律依据。出错最常见原因:
- 文件名写成
LICENSE.txt或license.md→ 必须是LICENSE(无后缀,大写 L) - 从网页复制时带中文引号、全角空格、自动换行 → 协议文本失效,扫描器标为
Unknown license - 年份写错、版权人名拼错、空行缺失 → MIT 协议第一行必须是完整标题
MIT License,第二行空,第三行才是Copyright (c) 2026 Your Name. -
LICENSE被.gitignore拦截 → 它不是密钥,必须 commit 进仓库
推荐做法:用 curl -sL https://raw.githubusercontent.com/spdx/license-list-data/master/text/MIT.txt > LICENSE 直接下载官方原始文本,再替换年份和作者。
最容易被忽略的是:license 字段、LICENSE 文件、实际分发内容三者必须一致。填了 "MIT" 却没放 MIT 全文,或用了 AGPL 却没同步源码,在法律和企业合规流程中都算硬伤。


















