composer licenses 命令在 composer 2.5+ 中已被移除,官方仅支持 composer show 配合 jq 解析 json 输出或直接解析 composer.lock 获取许可证信息,且必须人工核验 license 文件原文以确保合规。

composer licenses 命令到底存不存在?
它**在官方 Composer 2.5+ 版本中已被移除**,你敲 composer licenses 只会看到 Command "licenses" is not defined.——这不是你装错了,是它真没了。
- 旧版(≤2.4)可能残留该命令,但行为不一致、输出不可靠,不能用于合规审计
- 所有声称“
composer licenses --format=json能直接用”的教程,大概率基于过时环境或插件混淆 - 真正可用的原生命令只有
composer show,且必须已执行过composer install(否则vendor/为空,查不到任何包)
怎么一次性列出所有包的许可证?
用 composer show --format=json 配合 jq 是目前最稳的方案,覆盖全部已安装包(含 require-dev),字段清晰、可脚本化:
composer show --format=json | jq -r '.[] | "\(.name)\t\(.version)\t\(.license // "unknown")"'
- 输出为制表符分隔,方便导入 Excel 或 grep 筛选:如
monolog/monolog v3.5.0 MIT -
.license // "unknown"处理空值,避免 jq 报错;有些包写的是"license": "https://example.com/LICENSE",这时值不是 SPDX 标识符,得人工核对 - 若要排除开发依赖,加
--no-dev:composer show --no-dev --format=json | jq ...
为什么不能只信 composer.json 里的 license 字段?
因为字段内容常不规范,法务审核时根本不能当真:
- 值为
"proprietary"或"unlicensed"的包,必须去源码仓库翻LICENSE文件原文,确认是否真允许商用 - 有些包写
"BSD-3-Clause",但没注明全称,需手动匹配到BSD 3-Clause License才算合规 - 更隐蔽的是:字段为空,但根目录有
LICENSE,此时composer show不显示,得靠插件(如zicht/composer-license-plugin)或自己读composer.lock+ 检查文件系统
想绕过 vendor 直接查锁文件行不行?
可以,而且更轻量——composer.lock 是事实权威,哪怕 vendor/ 被删了也能跑:
jq -r '.packages[] | select(.license != null) | "\(.name)\t\(.version)\t\(.license | join(" | "))"' composer.lock
- 注意:这个方式会漏掉
license字段未声明、但实际存在 LICENSE 文件的包(比如某些历史遗留包) - 如果
composer.lock里.license是数组(如["MIT", "Apache-2.0"]),join(" | ")能正确展开;单字符串则原样输出 - CI 流程中推荐优先用此法,不依赖 PHP 环境和 vendor 完整性
license: MIT 就以为万事大吉——实际上得打开 GitHub 仓库,定位到 LICENSE 文件,逐字比对条款是否含“不得用于商业用途”“必须开源衍生作品”这类限制性文字。这一步,没有任何命令能自动帮你跳过。










