composer licenses 命令仅在 composer 2.2+ 中原生存在,输出各包 composer.json 的 license 字段值,非法律依据,不能替代 license 文件核查;推荐用 composer show --licenses 或 terrapiq/composer-license-check 进行合规验证。

composer licenses 命令在 Composer 2.2+ 中才原生存在,但即使可用,它也只输出各包 composer.json 里的 license 字段值——不是法律依据,不能替代 LICENSE 文件内容核查。
composer licenses 命令到底有没有?怎么判断能不能用
执行 composer --version 查版本:只有 2.2.0 及以上才内置 composer licenses。低于该版本(比如 2.1.14)运行会直接报错 Command "licenses" is not defined.。
常见误判点:
- 文档或旧教程写的
composer licenses,可能来自已废弃的插件(如zicht/composer-license-plugin),和当前原生命令无关 - CI 环境中默认镜像常带旧版 Composer,需显式升级或指定版本(如 GitHub Actions 中加
composer-version: '2.5') -
composer licenses --format=json输出顶层是 JSON 数组,不是对象;解析时别用.packages这类路径,直接用.[0].name或.[].license
composer show --licenses 是更通用的替代方案
composer show --licenses 在所有 Composer 2.x 版本中都稳定可用,且行为一致:它遍历 vendor/ 目录下已安装的每个包,读取其 composer.json 中的 license 字段。
实操要点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须先运行过
composer install,否则vendor/为空,命令报Package not found - 加
--no-dev排除require-dev包,避免把 PHPUnit 的 MIT 当成 runtime 依赖 - 加
--format=json后配合jq提取最可靠:composer show --no-dev --format=json | jq -r '.packages[] | "\(.name)\t\(.version)\t\(.license // ["unknown"] | join(" | "))"' - 字段值可能是字符串(
"MIT")、数组(["MIT", "Apache-2.0"])或 URL("https://example.com/LICENSE")——后者无法自动识别,必须人工点开验证
为什么不能只信 license 字段?必须查 LICENSE 文件原文
license 字段只是作者填的字符串,Composer 不校验、不标准化、不下载验证。合规审计真正认的是源码仓库根目录下的 LICENSE 或 LICENSE.md 文件全文。
典型风险场景:
-
"license": "MIT"✅ 合法,但前提是项目根目录真有标准 MIT 文本;若只有"license": "The MIT License"❌,SPDX 不识别,工具会标红 -
"license": ["MIT", "proprietary"]—— 多许可并存,你用哪条?得看实际集成方式和分发形态 -
"license": "proprietary"或空字段 —— 很多私有 fork 忘改composer.json,但代码里早换成 AGPL,必须grep -r "GNU GENERAL PUBLIC LICENSE.*v3" vendor/monolog/monolog/实锤 - GitLab 私有包未配置
repositories,composer show查不到,composer.lock里又没写license,只能手动翻对应 commit 的 LICENSE 文件
轻量自动化推荐:terrapiq/composer-license-check
它比原生命令多走关键一步:不仅读 license 字段,还尝试下载 LICENSE 文件,用正则匹配 SPDX 官方条款原文,并支持黑名单配置(如禁止 AGPL-3.0)。
使用流程:
- 安装:
composer require --dev terrapiq/composer-license-check - 运行:
./vendor/bin/license-check,默认输出所有包 + 实际匹配到的许可证类型 - CI 卡点:
./vendor/bin/license-check --forbidden-licenses="AGPL-3.0,GPL-3.0",命中即失败 - 注意:它仍依赖
vendor/存在,若 CI 中跳过install步骤,需改用直读composer.lock的方案
真正卡住合规落地的,从来不是“怎么列出来”,而是“怎么确认那一行字符串背后,真的对应着一份法律上有效的、可追溯到具体 commit 的 LICENSE 文本”。字段值只是索引,文件内容才是凭证——漏掉这层验证,所有命令输出都只是幻觉。










