Composer 原生无 licenses 命令,唯一内置可用的是 composer show --licenses(需先执行 install/update),它仅读取元数据中的 license 字段,不验证、不归一化、不替代人工合规审计。

Composer 没有 licenses 命令,别再试了——执行必报 Command "licenses" is not defined。所有声称“原生支持许可证审计”的操作,要么依赖已废弃插件,要么混淆了第三方工具。真正可用、稳定、无需额外安装的只有 composer show --licenses,但它只读元数据,不等于法律合规。
用 composer show --licenses 查当前已安装包的 license 字段
这个命令是 Composer 2.x 全版本内置的,但有硬性前提:必须先运行过 composer install 或 composer update,否则 vendor/ 为空,命令直接失败。
- 加
--no-dev排除require-dev包(如phpunit/phpunit),避免把测试工具的 MIT 当成生产依赖 -
--format=json输出是 JSON 数组,解析时别写.packages[0].license,正确路径是.[0].license或.[].name - 字段值可能是字符串(
"MIT")、数组(["MIT", "Apache-2.0"])或 URL("SEE LICENSE IN LICENSE.md")——Composer 不归一化、不校验、不展开
license 字段只是元数据,不是法律依据
看到 "license": "MIT" 不代表你可以合法分发。这个字段由包作者自由填写,Composer 从不下载、不比对、不验证其对应 LICENSE 文件原文。
-
"license": "MIT"✅ 合法?前提是项目根目录真有标准 MIT 文本;若填的是"The MIT License"❌,SPDX 工具会标红 -
"license": ["MIT", "proprietary"]—— 多许可并存,你实际用了哪条?得看集成方式和分发形态 -
"license": "SEE LICENSE IN LICENSE.md"——composer show绝不会打开该文件,你得手动点开核对全文 - 空值、
"unlicensed"、"proprietary"必须立刻标记,它们意味着法律盲区,不能靠“大概率是 MIT”跳过
CI/CD 中做自动化初筛,但必须人工跟进 LICENSE 文件
在 CI 流程里跑 composer show --licenses --no-dev --format=json 可以快速拉出所有生产依赖的 license 字段,用于初步过滤高风险项(比如含 GPL-2.0-only 或空 license)。但这只是起点。
- 自动化无法判断
vendor/monolog/monolog/LICENSE是否被修改、是否与 SPDX 标准一致 - 无法识别多许可场景下你实际调用的代码路径是否触发了限制性条款(如 GPL 的传染性)
- 真实合规审计必须人工打开每个
LICENSE或LICENSE.md文件,对照原文逐字核对,并结合你的分发方式(SaaS / 二进制分发 / 源码嵌入)判断适用性
最常被忽略的一点:composer.lock 里没 license 信息,composer.json 里写的 license 是作者声明,而最终法律效力落在源码仓库根目录的 LICENSE 文件——三者可能不一致,必须人工对齐。


















