composer license 命令不存在,正确命令是 composer licenses(复数),但需先全局安装 zicht/composer-license-plugin 插件,且依赖 vendor/ 下已安装的包信息。

composer license 命令**根本不存在**——运行会报错:Command "license" is not defined.这是高频误传,别再试了。真正可用的是
composer licenses(注意是复数),但它也不是 Composer 内置命令,而是依赖插件。
用 composer licenses 查许可证前,先装插件
Composer 本身不带许可证扫描能力,composer licenses 是由社区插件提供的。最稳定、维护活跃的是 zicht/composer-license-plugin(不是 daveposner 那个已停更的版本):
composer global require zicht/composer-license-plugin
⚠️ 注意点:
- 必须全局安装(
global require),项目本地安装后composer licenses不生效 - 安装后需确保
~/.composer/vendor/bin在你的$PATH中,否则终端找不到命令 - 如果
vendor/被清空过,得先composer install——插件要读取实际安装的包信息,不是只看composer.lock
composer licenses 的输出格式和真实能力
它能列出所有已安装包的 license 字段值,并对未声明的包尝试启发式识别(比如扫描 LICENSE 文件里有没有 “MIT License” 字样),但不保证 100% 准确:
-
composer licenses --format=json→ 输出结构化 JSON,适合 CI 中做自动过滤(如 grep"GPL") -
composer licenses --format=html→ 生成带超链接的 HTML 页面,点包名能跳转到其 GitHub,方便人工核验 -
composer licenses --short→ 只显示vendor/package MIT这类精简行,适合快速扫一眼有没有高风险协议 - 遇到
license: proprietary或unlicensed,必须人工点进源码仓库确认——这往往意味着不能用于开源项目
不用插件?用原生命令 + jq 快速提取(仅限有 license 字段的包)
如果你不能装全局插件(比如 CI 环境权限受限),可直接解析 composer.lock。它是合法 JSON,字段明确:
jq -r '.packages[] | select(.license != null) | "\(.name)\t\(.version)\t\(.license[])"' composer.lock | sort -u
这个命令只提取 composer.json 里明确定义了 license 的包,优点是零依赖;缺点也很明显:
- 跳过所有没填
license字段的包(现实中大量存在) - 完全不读
LICENSE文件,哪怕包根目录真有 MIT 文本也看不到 -
.license可能是数组(如["MIT", "Apache-2.0"]),所以用了.license[]展开
法律合规不能只靠命令行输出
无论用插件还是脚本,你拿到的都只是「声明的许可证名称」,不是法律结论。真实风险常藏在细节里:
- 某个包声明
MIT,但它的某次提交悄悄引入了 GPL 片段——命令扫不出来,得用FOSSA或ScanCode扫源码 - 主依赖用 MIT,但它依赖的子包是
AGPLv3,整个调用链可能触发传染性条款 -
composer show monolog/monolog显示license: MIT,但你仍该打开它的 GitHub 仓库,确认根目录LICENSE文件内容是否真与 SPDX ID 匹配
命令只是起点,不是终点。许可证清单生成后,务必留出人工核查时间——尤其当项目要上架 App Store、交付给金融客户或走 ISO 合规审计时。










