Composer 无内置命令直接输出所有包及其 license,但可通过 composer show --format=json --all 配合 PHP 脚本解析 JSON 提取 license 字段实现;该字段可能为 null、字符串或数组,需处理并归一化;注意 composer license 命令非官方功能,执行会报错;license 字段仅来自 composer.json,未必准确,合规审计需结合 composer.lock、源码 LICENSE 文件及专用工具。

Composer 本身没有直接输出「所有包及其 license」的内置命令,但可以通过 composer show 配合 JSON 输出和简单解析完成,无需额外安装插件。
用 composer show --format=json 提取全部包的 license 字段
这是最可靠的方式,因为 composer show 默认只显示已安装包(vendor/ 中存在的),且 JSON 格式稳定、字段明确:
-
license字段在每个包的元数据中,但可能为null、字符串或字符串数组(如["MIT", "BSD-2-Clause"]) - 不加
--all时仅显示当前项目 require 的包(不含 dev-only 包);加--all会包含require-dev中的包 - 若需包含未安装但写在
composer.json中的包(比如还没install),得先用composer install --dry-run或解析composer.lock
快速列出所有 license 的 shell 命令(Linux/macOS)
直接从 JSON 提取并去重归类,适合终端快速查看:
composer show --format=json --all | php -r "
\$data = json_decode(file_get_contents('php://stdin'), true);
foreach (\$data as \$pkg => \$info) {
\$lic = \$info['license'] ?? 'UNKNOWN';
if (is_array(\$lic)) \$lic = implode('|', \$lic);
echo trim(\$pkg) . \"\t\" . trim(\$lic) . \"\n\";
}
" | sort -k2,2 | column -t -s $'\t'
说明:
- 输出格式为
vendor/package MIT,按 license 排序便于发现混用情况 - 遇到空 license 会显示
UNKNOWN,不是 bug,是包本身没声明 - Windows 用户可用
composer show --format=json --all > licenses.json+ PHP 脚本处理,避免 PowerShell 解析 JSON 的坑
注意 composer license 命令根本不存在
很多人搜到过这个命令,但它不是 Composer 官方功能 —— 是某些第三方插件(如 hirak/prestissimo 旧版或社区脚本)添加的别名,现代 Composer(2.2+)默认不提供。执行会报错:
[RuntimeException] Command "license" is not defined.
所以不要依赖这个命令,也不要尝试 composer global require 某个“license 插件”,容易引入兼容性问题或过期逻辑。
真正要审计 license?别只看 show 输出
JSON 输出里的 license 字段只是包作者在 composer.json 里填的内容,不一定准确或完整:
- 有些包写
"license": "proprietary",但实际代码里含 MIT 文件头,得人工核对 -
composer.lock中的dist.url对应的压缩包,可能比composer.json声明的 license 更权威(尤其 fork 项目) - 若项目需合规交付(如 SaaS 产品),必须结合
composer audit(Composer 2.5+)或专用工具如license-checker、FOSSA
自动解析永远只是第一层筛查,关键包仍要查源码根目录下的 LICENSE 或 COPYING 文件。










