Composer 不检查许可证合规性,license 字段仅为作者填写的字符串;必须运行 composer install 后用 composer show 查 vendor 中已安装包的声明值,并手动核对 LICENSE 文件内容,SPDX 标识符与实际文件双验证才是硬要求。

Composer 本身不检查许可证合规性,所有“自动过审”都是错觉。你看到的 license 字段只是作者填的字符串,不是法律意见,更不代表实际分发文件内容。
composer show 是唯一可靠起点,但只读 vendor/ 下已安装包
它读的是 vendor/ 里每个包的 composer.json 中 license 字段,不查网络、不解析 LICENSE 文件、不映射 SPDX。必须先运行过 composer install,否则 vendor/ 为空,composer show 会报 Package not found ["unknown"]。
-
composer show vendor/package-name查单个关键依赖,确认其声明值(如MIT、GPL-3.0) -
composer show --all列全部已安装包,但输出杂乱,需配合grep或jq提取:composer show --format=json | jq -r '.packages[] | "\(.name) \(.license // "UNKNOWN")"' - 遇到
"license": "SEE LICENSE IN LICENSE.md"或空值、proprietary、unlicensed,必须手动打开对应包的LICENSE.md全文核对——composer show绝不会帮你读文件
别信 composer licenses —— 它在多数环境根本不存在
截至 2026 年 4 月,Composer 官方未内置 licenses 命令。你在文档或博客里看到的 composer licenses,要么是旧版插件(如 zicht/composer-license-plugin),要么是误传。直接运行大概率得到:Command "licenses" is not defined.。
- 若你用的是 Composer 2.2+ 且装了
zicht/composer-license-plugin,composer licenses --format=json才有效,它会尝试标准化许可证名(如把MIT License归一为MIT) - 该插件默认跳过私有仓库(如
"repositories": [{"type": "vcs", "url": "git@"}]),这类依赖得先composer archive导出再人工审计 - 没装插件却写进 CI 脚本?构建直接失败,不是报 warning,是 fatal error
composer audit 和 license 合规毫无关系
composer audit 只查 CVE 漏洞、废弃包和源连接失败,它根本不看 license 字段,也不判断 MIT/GPL 兼容性。它的 --ignore、--abandoned=fail 等参数,对许可证类型完全无效。
- CI 里只跑
composer audit就放行发布?等于把法务风险当空气 - 如果输出里出现 “License conflict”,那不是 Composer 报的——是某第三方工具或人工注入的假消息,发布时间标注为 2026 年 3 月 22 日,属不可信来源
- 真正要筛 GPL 类传染性许可,得靠脚本处理结构化数据:
jq -r '.[] | select(.license | test("GPL|AGPL|LGPL"; "i")) | "\(.name) \(.version) \(.license)"' licenses.json
SPDX 标识符 + LICENSE 文件双验证才是硬要求
合规审计过不了 ISO 或法务关,往往卡在两处:一是 composer.json 填了 "MIT",但源码根目录根本没有 LICENSE 文件;二是写了 "BSD-3-Clause",可实际文件里是修改过的非标准条款。
- SPDX 官方列表是唯一权威参考:把
composer show输出的值粘贴到 https://www.php.cn/link/f164ba76f5fba1522bfbb098c4597aa6 搜索,看 “Is This License Compatible With GPL?” 和 “Matching Rules” - 多许可证必须用 SPDX 允许的逻辑符:
"MIT OR Apache-2.0"✅,["MIT", "Apache-2.0"]❌(JSON 数组在旧版 Composer 会被截断) - “MIT License”、“The MIT License”、“mit” 都是无效标识符,Packagist 不识别,合规扫描工具会标红
最容易被忽略的一点:许可证声明值和实际分发文件内容不一致,比版本号漂移更危险。你查了 100 个包的 license 字段,只要漏掉一个没核对 LICENSE 文件的私有 fork,整份合规报告就失去法律效力。











