Composer的license字段仅为元数据声明,不触发任何行为;真正合规检查需显式启用--strict-licenses或使用composer audit配合jq解析,且LICENSE文件须手动创建并严格符合SPDX规范。
Composer 本身不提供 License 插件,也没有官方“集成 License 插件”这回事 —— 所有声称能自动检查、拦截或生成 LICENSE 的 Composer 插件,都是第三方扩展,且多数已废弃或不维护。
composer
.json 里 license 字段只是元数据,不触发任何行为
你填
或
,只会影响 Packagist 页面显示、
输出和部分扫描工具识别。它不会:
自动生成
文件
阻止安装含 GPL 的依赖
校验你自己的代码是否符合该协议
在
时做任何许可证判断
这个字段纯属声明用途,法律效力为零。真要管合规,得靠外部机制。
真正起作用的 license 检查必须显式启用 --strict-licenses
Composer 2.5+ 内置了基础许可证白名单校验能力,但默认关闭。启用方式只有两种:
运行命令时加参数:
或
在
中配置白名单:
(注意路径是
,不是顶层
)
关键点:
没加
,
完全无效
SPDX ID 大小写敏感:
可以,
在某些版本会失败
和
永远不匹配任何开源白名单
依赖包的
字段只要有一个值落在白名单里,就算通过(宽松 OR 匹配)
想自动检测高危协议?用 composer audit + jq
是 Composer 2.5+ 内置命令,但它默认只报 security 漏洞,不报 license 风险 —— 除非你手动解析 JSON 输出:
常见高危协议包括:
、
、
。它们在闭源项目中可能触发传染性开源义务。
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
CI 中更稳妥的做法是直接扫依赖声明:
注意:
匹配的是 SPDX ID 字符串,不是自然语言描述;写成
就会漏检。
LICENSE 文件必须手动生成,且格式极其敏感
Composer 不读、不写、不校验磁盘上的
文件 —— 但它被所有 FOSS 扫描器(FOSSA、Snyk、GitHub License Detection)当作法律依据。出错最常见原因:
文件名写成
或
→ 必须是
(无后缀,大写 L)
从网页复制时带中文引号、全角空格、自动换行 → 协议文本失效,扫描器标为
年份写错、版权人名拼错、空行缺失 → MIT 协议第一行必须是完整标题
,第二行空,第三行才是
被
拦截 → 它不是密钥,必须 commit 进仓库
推荐做法:用
直接下载官方原始文本,再替换年份和作者。
最容易被忽略的是:license 字段、LICENSE 文件、实际分发内容三者必须一致。填了
却没放 MIT 全文,或用了 AGPL 却没同步源码,在法律和企业合规流程中都算硬伤。
"license": "MIT""license": ["MIT", "Apache-2.0"]composer show --licensesLICENSEcomposer installcomposer install --strict-licensescomposer update --strict-licensescomposer.json"config": { "license": ["MIT", "Apache-2.0"] }config.licenselicense--strict-licensesconfig.license"mit""MIT""proprietary""unlicensed"licensecomposer auditcomposer 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"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"The MIT License"LICENSELICENSE.txtlicense.mdLICENSEUnknown licenseMIT LicenseCopyright (c) 2026 Your Name.LICENSE.gitignorecurl -sL https://raw.githubusercontent.com/spdx/license-list-data/master/text/MIT.txt > LICENSE"MIT"