Composer 不管理 License 合规性,仅支持声明;自动化需外部工具组合且关键环节须人工确认:license 字段仅为元数据,不校验真实性;composer show 是唯一原生可信查询方式,但受限于已安装包和显式声明;licenses 命令非官方内置,依赖第三方插件;合规检查必须分三步,最后一步必须人工核验 LICENSE 文件原文与 SPDX 一致性。

Composer 本身不管理 License 合规性,只支持声明;所谓“自动化管理”必须靠外部工具组合实现,且所有关键环节都需人工确认。
composer.json 的 license 字段只是元数据,不是法律承诺
你在 composer.json 里写 "license": "MIT",只会影响 Packagist 页面显示、composer show 输出和部分扫描工具识别。它不会:
- 自动生成
LICENSE文件 - 校验你自己的代码是否符合 MIT 条款
- 阻止安装含
GPL-3.0-only的依赖 - 读取或验证包目录下实际的
LICENSE文件内容
这个字段由作者自由填写,可能是 "MIT",也可能是 "SEE LICENSE IN LICENSE.md" 或空字符串 —— Composer 从不校验真假。
composer show vendor/package-name 是唯一原生可信的许可证查询方式
这是 Composer 官方唯一开箱即用、不依赖插件、不依赖网络的许可证信息来源。但它有硬限制:
- 必须已执行过
composer install或composer update,否则报Package not found - 只查显式声明在
require或require-dev中的包,对传递依赖(如symfony/polyfill-intl-idn)完全不可见 - 遇到
"license": "SEE LICENSE IN LICENSE.md",它只原样输出,绝不会打开并解析该文件 - 返回值是字符串,不是 SPDX ID:比如可能返回
Apache License, Version 2.0,但 SPDX 只认Apache-2.0,大小写还敏感
composer licenses 命令根本不存在(官方未内置)
截至 2026 年 6 月,Composer 核心从未提供 licenses 命令。你运行它大概率看到:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Command "licenses" is not defined.
所有声称能用它生成合规报告的教程,背后都依赖第三方插件,例如:
-
zicht/composer-license-plugin:需手动安装composer require --dev zicht/composer-license-plugin,启用后才支持composer licenses --format=json -
aquasecurity/composer-license-checker:全局安装后独立命令composer-license-checker,不污染项目vendor/
这些插件能递归扫描依赖、尝试标准化许可证名(如把 MIT License 归一为 MIT),但依然无法替代人工核验:它们不判断传染性,不验证 LICENSE 文件原文,对私有 Git 仓库依赖默认跳过。
真正落地的合规检查流程必须分三步走
自动化只能做前两步,第三步永远要人盯:
- 用插件导出结构化数据(如
composer licenses --format=json > licenses.json) - 用
jq或 Python 筛出风险项:jq -r '.[] | select(.license | test("GPL|AGPL|LGPL"; "i"))' licenses.json - 对每个命中项,手动打开其
vendor/{vendor}/{package}/LICENSE文件,逐字比对是否与 SPDX 官方文本一致,并确认年份、版权主体无误
最容易被忽略的是:SPDX 兼容性矩阵(比如 LGPL-2.1-only 和 MIT 兼容,但 AGPL-3.0-only 和几乎所有宽松协议都不兼容)必须查 spdx.org/licenses/ 原文,不能靠记忆或博客总结。

















