Composer licenses 命令如何查看项目所有依赖的许可证? (合规性检查)

11次阅读

composer licenses 命令仅显示项目顶层包的 license 字段值,不递归扫描依赖;完整许可证信息需用 composer show –format=json 配合 jq 解析,但 license 字段可能缺失、模糊或不规范,最终应以源码中的 LICENSE 文件为准。

Composer licenses 命令如何查看项目所有依赖的许可证? (合规性检查)

composer licenses 命令本身不输出完整许可证列表

直接运行 composer licenses 只会显示顶层包(即你的项目)的 license 字段值,**不是所有依赖的许可证汇总**。它不递归扫描 vendor 目录,也不解析 composer.json 中每个依赖的 license 字段。这是最常被误解的一点——命令名有误导性,实际功能非常有限。

用 composer show –format=json 获取全部依赖许可证

真正能批量提取许可证信息的方式是结合 composer show 的 JSON 输出和轻量解析。它会列出所有已安装依赖及其元数据,其中 license 字段就在每个包对象里:

composer show --format=json | jq -r '.packages[] | select(.license != NULL) | "(.name) (.version) (.license | join(", "))"'

说明:

  • jq 是必需的命令行 JSON 处理工具macOS/linux 通常需 brew install jqapt install jqwindows 可用 jq-win64.exe
  • select(.license != null) 过滤掉没声明 license 的包(避免空值干扰)
  • join(", ") 处理一个包声明多个许可证的情况(如 ["MIT", "apache-2.0"]
  • 输出形如:monolog/monolog 2.10.0 MITsymfony/console 6.4.0 MIT, Apache-2.0

注意 license 字段可能缺失、模糊或不规范

Composer 不强制要求包作者填写 license,也不校验值是否符合 SPDX 标准。常见问题包括:

  • "license": "proprietary""license": "unlicensed" —— 无法自动判断合规风险,需人工核查
  • "license": "BSD" —— 没写具体版本(2-clause?3-clause?),SPDX 推荐用 BSD-2-Clause
  • "license": "see LICENSE file" —— 字符串无意义,必须去对应包的 LICENSE 文件看原文
  • 私有包或 fork 包可能完全没填 license 字段,composer show 就不会出现在结果里

自动化合规检查建议用专用工具

靠 shell + jq 做初筛可以,但真要落地合规流程(比如生成报告、拦截高风险许可证、对接 CI),推荐用更健壮的工具:

  • composer-license-checker:专为 php 项目设计,支持白名单、黑名单、导出 csv/html 报告
  • FOSSABlack Duck:商业方案,支持跨语言、SBOM 生成、漏洞联动
  • 自建脚本时,别只依赖 license 字段 —— 应同时读取每个包根目录下的 LICENSELICENSE.md COPYING 文件内容做正则匹配(例如识别 “gnu GENERAL public LICENSE Version 3”)

许可证字段只是线索,最终以源码附带的许可证文本为准。很多法律团队拒绝接受仅基于 composer.json 的结论。

text=ZqhQzanResources