composer show vendor/package-name 可直接查看包的 license 字段值,它读取 composer.json 声明内容,不依赖外部服务;但需人工核验 proprietary、空值或模糊声明(如 see license in license.md),并结合 spdx 官方列表确认兼容性与真实性。

composer show 如何快速查出包的 license 字段
直接运行 composer show vendor/package-name 就能看到该包的 license 字段值,这是最轻量、最可靠的源头信息。它读取的是 composer.json 里声明的值,不依赖外部服务或解析逻辑。
常见现象是看到 MIT、Apache-2.0、GPL-2.0-only 这类字符串,但注意:有些包写的是 proprietary、unlicensed 或空值,这类必须人工确认——composer show 不会警告你风险。
- 如果字段是
BSD-3-Clause或ISC,基本可视为与 MIT 类似,宽松兼容 - 遇到
GPL-3.0-or-later要警惕:一旦项目闭源,可能触发传染性条款 -
composer show不验证 license 文本真实性,只照搬元数据;有包把license写成MIT,但实际 LICENSE 文件是自定义限制条款
license 兼容性不能只看字符串,得查 SPDX 官方映射
不同许可证之间是否兼容,不是靠经验猜的。比如 LGPL-2.1-only 和 MIT 是兼容的,但 AGPL-3.0-only 和几乎所有宽松协议都不兼容——这个结论来自 SPDX License List 的官方兼容性矩阵。
实操建议:把 composer show 输出的 license 值(如 BSD-2-Clause)粘贴到 SPDX 页面搜索,点开后看 “Is This License Compatible With GPL?” 和 “Matching Rules” 栏。别信第三方博客总结的“兼容表”,SPDX 才是事实来源。
- SPDX ID 必须完全匹配:比如
Apache-2.0≠Apache License, Version 2.0(后者是非标准写法,composer show可能显示这个,但 SPDX 不认) - 带
-only和-or-later后缀的 license 语义差异极大,GPL-2.0-only无法和GPL-3.0-or-later混用 - 某些包用
SEE LICENSE IN LICENSE.md这种模糊声明,composer show会原样输出,此时必须手动打开对应文件核对全文
自动化检查要用 composer licenses + 自定义规则,别信 composer audit
composer licenses 命令能批量导出所有依赖的 license 字段,配合 --format=json 可以管道给脚本处理;而 composer audit 默认只报已知高危 license(如 AGPL),且不支持自定义白名单,实用性很低。
真正可用的检查方式是:先用 composer licenses --format=json > licenses.json 导出,再用 Python 或 jq 筛选非预期 license。例如过滤掉所有含 GPL 的条目:
jq -r '.[] | select(.license | contains("GPL")) | "\(.name) \(.license)"' licenses.json
-
composer licenses不解析嵌套依赖的 license,只显示 root require 的直接依赖项 - 如果项目用了
replace或provide,部分包可能不显示在licenses列表中,需结合composer show --tree交叉验证 - 不要把
composer audit --type=license当合规依据——它依赖 Packagist 的元数据缓存,而很多私有包或老旧包的 license 字段压根没填
私有包和 fork 包的 license 风险最容易被忽略
你用 composer show 查到某个私有 Git 包的 license 是 MIT,但这只是仓库 composer.json 里写的,没人保证它和主分支 LICENSE 文件一致。更常见的是:团队 fork 了 monolog/monolog,改了几行代码,但忘记同步更新 LICENSE 文件或 composer.json 中的 license 字段。
- 对私有源包,必须检查其 Git 仓库根目录是否存在有效的 LICENSE 文件,并与
composer.json的license字段比对 - fork 包若修改了源码,即使原项目是 MIT,你的修改部分仍受原 license 约束,但分发时需明确标注变更,否则可能违反
copyright notice条款 - CI 中加一道检查:用
git ls-files | grep -i license确认 LICENSE 文件存在,再用grep -q '"license":' composer.json确保字段非空——这两步缺一不可
license 合规不是“查出来就完事”,关键在持续同步:包升级时 composer update 可能悄悄换掉 license,而 composer show 只反映当前快照。得把 license 字段纳入 lock 文件 diff 或依赖审计流水线里。










