真正能列出所有依赖许可证的命令是 composer show --licenses,它遍历 vendor 目录输出每个已安装包的名称、版本和 license 字段值,支持 --no-dev 和 --format=json 等参数。

composer licenses 命令到底显示谁的许可证?
它只显示你当前项目的顶层 composer.json 里写的 "license" 字段,比如 myapp/myproject → MIT —— 跟 vendor 里的任何依赖都无关。这不是 bug,是设计如此。很多人一跑 composer licenses 就以为“全量依赖许可证扫完了”,结果法务审核时才发现漏了一堆。
真正能列出所有依赖许可证的命令是哪个?
用 composer show --licenses。它会遍历整个 vendor/ 目录,输出每个已安装包的名称、版本和 license 字段值(如 MIT、Apache-2.0、["BSD-3-Clause", "GPL-2.0"])。
- 加
--no-dev可排除开发依赖,适合发布前审计 - 加
--format=json方便脚本解析,但注意字段可能为空或为 URL - 不加参数时默认含
require-dev,别误以为“生产环境没这包”就忽略
license 字段靠不靠谱?为什么还得看 LICENSE 文件?
非常不靠谱。常见问题包括:"license": "https://github.com/foo/bar/LICENSE"(填了链接不是 SPDX 标识符)、"license": ["MIT", "proprietary"](多许可并存需人工判断)、甚至字段为空但根目录有 LICENSE.md。SPDX 不校验,Composer 也不强制填。
- 合规场景下,必须用
grep -r -i "GNU GENERAL PUBLIC LICENSE.*v3" vendor/或正则匹配实际文本 -
composer show --licenses只是起点,不是终点 - 某些包(如私有 fork)可能改了代码但没改
composer.json里的 license 字段
有没有更省事的自动化方案?
可以装插件:composer global require zicht/composer-license-plugin,之后运行 composer licenses --format=html 生成带跳转链接的页面,每行都连到对应包的 GitHub LICENSE 文件。
- 注意:该插件依赖 vendor 存在,CI 环境若没装依赖会失败
- 若想跳过 vendor 直读锁文件,可用
jq -r '.packages[] | select(.license != null) | "\(.name)\t\(.version)\t\(.license | join(" | "))"' composer.lock,但会漏掉 lock 文件里没显式存 license 的包 - 最稳的路径仍是:先
composer show --licenses快筛,再对高风险包(GPL、AGPL、未声明)手动查源码 LICENSE
许可证审查不是“跑一条命令就完事”的事——字段值只是线索,源码里的 LICENSE 文件才是法律依据。尤其当项目要商用、出口或过等保时,跳过这一步,后面补的成本远高于多花十分钟 grep。










