如何进行Composer包许可证审查及合规性检测技巧分析?
- 内容介绍
- 文章标签
- 相关推荐
本文共计967个文字,预计阅读时间需要4分钟。
使用Composer命令`composer licenses`可以一键查看所有依赖的许可证信息。如果你运行此命令时遇到错误,并非是环境问题,而是因为官方压根没有实现这个功能。真正的合规范检查,需要依赖组合策略:
怎么用原生命令快速看一个包的 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,它记录了所有即将安装的包及其元数据:
- 用
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 合规审计
本文共计967个文字,预计阅读时间需要4分钟。
使用Composer命令`composer licenses`可以一键查看所有依赖的许可证信息。如果你运行此命令时遇到错误,并非是环境问题,而是因为官方压根没有实现这个功能。真正的合规范检查,需要依赖组合策略:
怎么用原生命令快速看一个包的 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,它记录了所有即将安装的包及其元数据:
- 用
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 合规审计

