不能。composer licenses 命令仅输出 composer.lock 中记录的许可证字段,不校验实际 LICENSE 文件、不展开子依赖协议、不检测 fork 修改,也无法判断兼容性或法律风险。

composer licenses 命令能直接列出所有依赖的协议吗?
不能。composer licenses 只输出项目中已安装依赖的许可证类型(如 MIT、Apache-2.0、GPL-3.0),但不校验兼容性,也不展开子依赖的协议嵌套关系;它读取的是 composer.lock 中每个包记录的 license 字段,而非实际源码里的 LICENSE 文件内容。
常见误判场景:某个包在 composer.json 里声明 "license": "MIT",但实际发布时漏传 LICENSE 文件,或混用了 GPL 代码——composer licenses 完全不会发现。
怎么让 licenses 命令输出更实用的格式?
默认输出是纯文本表格,对审计无意义。必须加参数导出结构化数据:
-
composer licenses --format=json:生成 JSON,方便脚本解析和过滤 -
composer licenses --format=markdown:适合粘贴进内部合规文档 -
composer licenses --no-dev:排除require-dev的包(如 phpunit、phpstan),避免把测试工具的 GPL 协议误计入生产合规范围
注意:--format=json 输出的 license 字段可能为数组(如 ["MIT", "BSD-3-Clause"]),也可能是字符串(如 "Apache-2.0"),解析时需兼容两种类型。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么看到 “proprietary” 或空 license 就该立刻停用?
Composer 允许包声明 "license": "proprietary" 或留空,这类包完全不受开源协议约束,法律风险极高:
- 无法确认能否商用、能否修改、能否再分发
- 部分企业法务直接禁止任何
proprietary依赖入库 - 空 license 不代表“无协议”,而是作者未声明——等同于默认保留所有权利
实操建议:用 composer licenses --format=json | jq -r '.[] | select(.license == null or (.license | type == "string" and .license | contains("proprietary")) or (.license | type == "array" and ("proprietary" as $p | .[] | contains($p))) ) | .name' 快速揪出问题包。
licenses 命令无法替代真正的协议审计
它只是第一道筛子。真正要过审,还得人工核对三件事:
- 该包实际发布的 tarball 或 tag 是否包含完整 LICENSE 文件(不是仅在 GitHub README 写一句)
- 其依赖树中是否存在传染性协议(如 GPL-2.0-only)且你的项目是闭源分发
- 是否触发了协议中的附加条款(如 React 的 BSD+Patents 曾引发争议,虽已移除,但旧版本仍存在)
最常被忽略的一点:Composer 不检查 fork 后修改过的包。如果你 require 了一个 GitHub 上的 fork("vendor/package": "dev-master#abc123"),composer licenses 显示的仍是原包的 license 字段,和你实际拉下来的代码毫无关系。

















