composer install 不检查 license 合规性,需通过 ci 脚本解析 composer.lock 拦截违规 license;composer show 和 zicht/composer-license-plugin 均有局限,最终仍需人工核对 license 文件全文。

composer install 本身不做 License 合规扫描
Composer 在 install 或 update 过程中,完全不检查、不校验、不警告任何 license 字段内容。它只按依赖图下载包、写入 vendor/、生成 composer.lock。哪怕你声明了 "license": "proprietary" 或空值,安装照样成功。
常见误判点:
-
composer install --dry-run不会提前报 license 风险,它只模拟依赖解析,不读 license 字段 -
composer audit只查 CVE 和废弃包,跟 license 类型(MIT/GPL)毫无关系 - 即使
composer.json里写了"license": "GPL-3.0",Composer 也不会阻止你把它用在闭源项目里——法律风险由你承担
想在 install 前卡住违规 license?必须靠 CI 硬拦截
真正能“在安装前拦截”的,不是 Composer 自身,而是你在 CI 流程中插入的检查脚本。关键前提是:不依赖 vendor/ 目录(因为 install 还没跑),直接解析 composer.lock。
推荐做法(适用于 Linux/macOS CI):
- 用
jq -r '.packages[] | "\(.name)\t\(.version)\t\(.license // ["unknown"] | join(" | "))"' composer.lock提取所有已解析依赖的 license 声明 - 对输出逐行 grep 或用
awk匹配黑名单,例如:grep -E "(GPL|AGPL|LGPL|proprietary|unlicensed)" - 匹配到就
exit 1,让构建失败,阻断后续composer install - 注意:有些包 license 字段为空或为 URL(如
"https://example.com/LICENSE"),jq会输出unknown,这类必须人工确认,不能跳过
为什么不能只信 composer show 的结果?
composer show vendor/package-name 是装完后查 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 - 只查显式声明在
composer.json的包,像symfony/polyfill-intl-idn这类传递依赖压根不会出现 - 字段值照搬不处理:遇到
"license": "SEE LICENSE IN LICENSE.md",它绝不会打开文件;遇到["MIT", "Apache-2.0"],也不说明是“二选一”还是“同时满足”
也就是说,composer show 只能告诉你“作者写了什么”,不能告诉你“实际分发内容是否合规”。SPDX 标识符和 LICENSE 文件全文,二者缺一不可。
zicht/composer-license-plugin 能补上哪些缺口?
如果你需要递归覆盖所有依赖(含 require-dev 和传递依赖)、标准化模糊 license 描述、并尝试读取真实 LICENSE 文件内容,zicht/composer-license-plugin 是目前最成熟的第三方方案。
但它不是万能的:
- 安装后才有
composer licenses --format=json命令,没装插件就写进 CI?构建直接 fatal error - 默认跳过私有仓库依赖(比如
"repositories": [{"type": "vcs", "url": "git@"}]),这类必须先composer archive导出再人工审计 - 它能把
"The MIT License"归一为MIT,但对"SEE LICENSE IN LICENSE.md"的匹配仍依赖文件内容是否标准——如果包里 LICENSE.md 被删改过,结果依然不准
真正的合规底线始终是:工具只能筛出明显问题,最终确认必须点开每个可疑包的 LICENSE 文件,对照 spdx.org/licenses 核对全文。这点没法自动化。










