composer licenses 命令不存在,官方仅支持 composer show --licenses 和 composer show vendor/package;需先执行 install/update,推荐用 composer show --licenses --recursive --no-dev --format=json 导出全量许可证清单供后续分析。

composer licenses 命令根本不存在,别被旧文档骗了
你在官方文档或某些博客里看到的 composer licenses 命令,大概率是混淆了第三方插件行为或误传的旧信息。Composer 官方核心从未提供该命令——运行它只会得到 Command "licenses" is not defined。这不是你环境没配好,而是它压根没被实现过。
真正可用、原生、无需插件的命令只有两个:composer show --licenses 和 composer show vendor/package。前者从 vendor/composer/installed.json 读取已安装包的 license 字段,后者查单个包的 composer.json 声明。两者都要求先执行过 composer install 或 composer update,否则 vendor 目录为空,结果为空或报错。
用 composer show --licenses --recursive 导出全量许可证清单
这是目前最接近“一键生成合规清单”的原生方案,但必须加 --recursive,否则只显示顶层依赖,漏掉 90% 的传递依赖(比如 symfony/console 依赖的 symfony/polyfill-mbstring)。
-
composer show --licenses --recursive --format=json > licenses.json:导出结构化数据,便于后续用jq或 Python 处理 -
--no-dev必须显式加上:法务通常只审生产环境依赖,require-dev里的phpunit或mockery不应混入最终报告 - 输出中
license字段值直接来自各包 composer.json,可能是字符串("MIT")、数组(["MIT", "Apache-2.0"])或空值,不标准化、不校验 - 遇到
"license": "SEE LICENSE IN LICENSE.md"或unknown,命令不会自动读取文件内容——这一步必须人工打开对应仓库核对原始 LICENSE 文件
过滤 GPL/AGPL 等高风险许可证的实际命令
法务真正盯的是传染性许可证,不是 MIT 或 Apache-2.0。用 JSON 输出 + jq 是最稳的筛选方式,注意大小写和变体:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 基础筛选:
jq -r '.[] | select(.license | test("GPL|AGPL|SSPL|LGPL"; "i")) | "\(.name) \(.version) \(.license)"' licenses.json - 避免漏匹配:
test("gpl|agpl|sspl|lgpl"; "i")比contains("GPL")更可靠,能覆盖gpl-3.0-only、AGPL-3.0等写法 - 别信
composer audit:它只查 CVE 和废弃包,输出里任何“License conflict”字样都是假消息,代码里根本没有许可证冲突检测逻辑 - 私有包或 fork 仓库(如
"repositories": [{"type": "vcs", "url": "git@..."}])默认不出现在show --recursive结果里,得单独composer show或手动审计
license 字段为空或 proprietary 时必须人工介入
自动化工具能筛出明显问题,但以下三类情况绕不开人:
-
"license": ""或"license": "proprietary":不等于“闭源合规”,只是表示“非 OSI 认证”,必须查该包实际分发条款(官网下载页、GitHub Release assets 中的 LICENSE 文件是否齐全) - 许可证组合风险:比如项目用 MIT,但依赖了 MPL-2.0 包——MPL 允许与 MIT 共存,但要求修改过的 MPL 文件保持开源;这种边界场景命令行无法判定
- 部署形态影响传染性:SaaS 模式下 GPL-3.0 是否触发 Affero 条款?动态链接 vs 静态链接对 LGPL 的适用性?这些必须结合架构图由法务判断,不是导出个 JSON 就能解决的
别把 composer show --licenses 当成合规终点——它只是帮你快速圈出哪些包值得翻源码、查官网、约法务开会。










