composer show 是唯一原生可用的 license 查询命令,仅读取已安装包 composer.json 中显式声明的 license 字段,不解析文件、不联网、不支持传递依赖,结果稳定但受限于 vendor 目录存在且需提前执行 install/update。

没有“composer licenses”命令,也别信什么一键查全量 License 的说法——官方压根没实现它,你运行报错不是环境问题,是命令根本不存在。
composer show 是唯一原生可用的起点
它读 vendor/ 下已安装包的 composer.json 里的 license 字段,不联网、不解析文件、不依赖插件,结果最稳定,但限制也很明确:
- 必须已执行过
composer install或composer update,否则报Package not found - 只查
composer.json中显式声明的包,symfony/polyfill-intl-idn这类传递依赖完全不会出现 -
license字段值照搬输出:遇到"SEE LICENSE IN LICENSE.md",它绝不会打开文件,你得手动进vendor/vendor/package/LICENSE.md核对全文 - 支持通配符,比如
composer show monolog/*可一次列出整个 monolog 生态的 license 值 - 字段可能是字符串(
"MIT")、数组(["MIT", "Apache-2.0"]),甚至 URL("https://example.com/LICENSE")——这些都不能直接当作合规依据
CI 里不能等 vendor 生成才检查
CI 流程卡在 composer install 之后才查 License,就晚了。更早、更安全的做法是直接解析 composer.lock:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
jq -r '.packages[] | "\(.name)\t\(.version)\t\(.license // ["unknown"] | join(" | "))"' composer.lock提取结构化清单 - 注意:有些包在 lock 文件里
license字段为空或为 URL,jq会输出unknown,这类必须人工确认 - 该方式不依赖
vendor/,适合 CI 早期阶段卡点;但结果可能与composer show不一致——这是常态,不是 bug,因为两者数据源不同
真正要覆盖传递依赖,得靠 zicht/composer-license-plugin
当需要递归扫描所有依赖(含 require-dev 和传递依赖)、标准化模糊 license 值(如把 "The MIT License" 归一化为 MIT)、并尝试读取实际 LICENSE 文件时,它是当前最成熟的方案:
- 安装:
composer require --dev zicht/composer-license-plugin - 导出:
composer licenses --format=json > licenses.json - 它能把
"SEE LICENSE IN LICENSE.md"替换为实际匹配到的 SPDX ID(如MIT或GPL-3.0-only) - 对私有 fork(如
"repositories": [{"type": "vcs", "url": "git@"}])默认跳过,得先composer archive导出再人工审计
license 字段只是元数据,不是法律凭证
看到 "license": "MIT" 不代表合规。这个字段由包作者自由填写,无强制校验,也不保证与实际 LICENSE 文件内容一致:
-
MIT License、mit、The MIT License都是无效 SPDX 标识符;合规工具只认MIT - 遇到
SEE LICENSE IN LICENSE.md,composer show绝不会自动读取该文件——你得手动打开对应包的LICENSE.md核对全文 -
GPL-2.0-only和GPL-2.0-or-later法律效力完全不同,但composer show不区分,也不会提示 - 空值、
unlicensed、proprietary必须立刻标记,它们意味着法律盲区,不能靠“大概率是 MIT”跳过
自动化能筛出明显风险项,但最终判断仍绕不开人:确认 LICENSE 文件是否真实存在、分发场景是否触发传染性条款、白名单是否覆盖当前版本号——这些都不是命令行能算出来的。










