Composer 不提供 License 合规性自动化扫描能力,所有“自动过审”均为错觉;中文环境下需警惕模糊声明、非标准写法及私有源跳过问题。

Composer 本身不提供 License 合规性自动化扫描能力,所有“自动过审”都是错觉;中文环境下更需警惕模糊声明、非标准写法和私有源跳过问题。
composer show vendor/package-name 是唯一可信的原生起点
它直接读取 vendor/ 中已安装包的 composer.json 里的 license 字段,不联网、不解析文件、不猜测——但必须满足两个硬前提:
- 已执行过
composer install或composer update,否则报Package not found - 只覆盖显式声明在
require或require-dev中的包,symfony/polyfill-*这类传递依赖完全不可见 - 遇到
"license": "SEE LICENSE IN LICENSE.md",它原样输出,绝不会打开该文件;遇到空值、"proprietary"、"unlicensed",也无任何警告
中文项目常见风险是把 "MIT License" 当成有效 SPDX ID,而实际合规工具只认 MIT。SPDX 官方列表才是唯一依据,不能靠经验或博客总结。
composer licenses 命令是否可用?先看版本再决定
截至 2026 年 6 月,composer licenses 在 Composer 2.2.0+ 中才原生存在,但行为极其有限:
- 低于 2.2.0(如 2.1.14)运行会直接报错:
Command "licenses" is not defined. - 它只读
vendor/下已安装包的license字段,不处理composer.lock中未安装的传递依赖 -
--format=json输出是 JSON 数组,不是对象,解析时别用.packages这类路径 - 对私有 Git 仓库(如
"repositories": [{"type": "vcs", "url": "git@"}])默认跳过,显示unknown
CI 环境中若未显式指定 Composer 版本(如 GitHub Actions 的 composer-version: '2.5'),很可能因镜像自带旧版导致构建失败——这不是 warning,是 fatal error。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
zicht/composer-license-plugin 是当前最实用的批量方案
当需要覆盖传递依赖、标准化模糊值、并尝试匹配实际 LICENSE 文件内容时,这个插件仍是中文项目落地最可行的选择:
- 安装:
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(如GPL-3.0-only) - 但对私有 fork 默认跳过,这类依赖必须先
composer archive导出,再人工翻仓库根目录的 LICENSE 文件
注意:它仍不判断传染性(如 GPL 是否因动态链接触发)、不验证你自己的代码是否符合 MIT 条款、也不校验声明与实际文件是否一致——这些环节必须人工核对原文。
真正落地的合规检查必须分三步走,最后一步无法绕开人
自动化只能完成线索收集,法律有效性永远取决于人工确认:
- 第一步:用
composer licenses --format=json --no-dev > licenses.json快速筛出非预期 license(如AGPL-3.0-only、proprietary) - 第二步:对每个高风险包,手动打开其
vendor/xxx/LICENSE或 GitHub release assets,核对全文是否与 SPDX 官方文本一致 - 第三步:结合部署方式判断传染性——SaaS 场景下 GPL 是否触发?动态链接 vs 静态链接?这些必须由架构师+法务共同确认,命令行无法推演
最容易被忽略的是版本漂移:供应商白名单可能只覆盖 v1.2.0,但 composer update 后升到 v1.3.0,新版本 license 可能已变更。每次更新后,都得重跑筛查+人工复核。

















