composer show vendor/package-name是唯一原生命令起点,需已执行install/update,仅查显式声明包,不处理传递依赖或自动解析LICENSE文件;license字段值如"SEE LICENSE IN LICENSE.md"需手动核对原文。

Composer 没有内置的 composer licenses 命令能“一键查全量许可证”——你运行它报错不是环境问题,是官方压根没实现这个功能。真正可落地的合规检查,得靠组合策略:用 composer show 抓源头声明,用 composer.lock 提前卡点,再用插件补传递依赖和模糊值。
怎么用原生命令快速看一个包的 license 字段
composer show vendor/package-name 是唯一不依赖插件、不联网、不解析文件的可靠起点。它读的是 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 值
如何在 CI 里不依赖 vendor 目录提前筛查风险
CI 流程不能等 composer install 完成才开始合规检查。更高效的做法是直接解析 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(如"https://example.com/LICENSE"),jq会输出unknown,这类必须人工确认 - 该方式不依赖
vendor/,适合 CI 早期阶段卡点;但结果可能与composer show不一致——这是常态,不是 bug,因为两者数据源不同
为什么 zicht/composer-license-plugin 是目前最稳的批量方案
当需要覆盖传递依赖、标准化模糊 license 值、并尝试读取实际 LICENSE 文件时,zicht/composer-license-plugin 是当前最成熟的第三方选择:
- 安装:
composer require --dev zicht/composer-license-plugin - 导出:
composer licenses --format=json > licenses.json,它会递归扫描所有依赖(含require-dev和传递依赖) - 它能把
"The MIT License"归一化为MIT,把"SEE LICENSE IN LICENSE.md"替换为实际匹配到的 SPDX ID(如MIT或GPL-3.0-only) - 对私有 fork(如
"repositories": [{"type": "vcs", "url": "git@"}])默认跳过,得先composer archive导出再人工审计
license 字段只是线索,不是法律凭证
看到 "license": "MIT" 不代表合规,它只是作者填的字符串,无强制校验:
-
MIT、mit、The MIT License都不是有效 SPDX 标识符;合规工具只认MIT -
GPL-2.0-only和GPL-2.0-or-later法律效力完全不同,但composer show不区分,也不会提示 - 空值、
proprietary、unlicensed必须立刻标记——它们意味着法律盲区,不能靠“大概率是 MIT”跳过 - 最终判断必须去源码仓库根目录找
LICENSE或LICENSE.md,用正则匹配全文(比如搜GNU GENERAL PUBLIC LICENSE.*Version 3),否则过不了 ISO 合规审计

















