composer show --licenses 能查到所有已安装依赖在 composer.json 中声明的 license 字段值(如 "mit"、["mit", "apache-2.0"] 或 "see license in license.md"),但不能校验其真实性、不解析实际 license 文件、不联网比对 spdx、不识别私有修改、不判断许可兼容性或法律风险。

composer show --licenses 能查到什么,不能查到什么
它只读取 vendor/ 下每个包的 composer.json 里的 license 字段,原样输出,不做校验、不解析 LICENSE 文件、不联网比对 SPDX 标准。字段值可能是 "MIT"、["MIT", "Apache-2.0"]、"SEE LICENSE IN LICENSE.md",甚至空字符串或 "proprietary"——这些都会照搬显示。
常见误判点:
- 看到
"MIT"就认为合规:SPDX 只认"MIT",写成"The MIT License"或"MIT License"工具会标红 - 忽略数组形式许可:如
["MIT", "GPL-3.0"],没说明是“二选一”还是“同时满足”,必须查原始 LICENSE 文件才能定性 - 把
"SEE LICENSE IN LICENSE.md"当作已验证:composer show绝不会自动读取该文件,你得手动打开对应包的LICENSE.md核对全文
为什么不能用 composer licenses 命令
composer licenses 在 Composer 2.2+ 才原生支持,但即使可用,它和 composer show --licenses 行为完全一致,只是别名。低于 2.2 的版本(比如 CI 环境里默认装的 2.1.14)运行直接报错:Command "licenses" is not defined。
更关键的是:这个命令根本不是法律工具。它不校验字段真实性,不检查实际分发形态,也不识别私有修改或混入代码片段。真正有法律效力的,永远是源码仓库根目录下的 LICENSE 或 LICENSE.md 文件原文。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确保已执行过
composer install,否则vendor/为空,命令报Package not found - 加
--no-dev排除require-dev包,避免把 PHPUnit 的 MIT 许可当成 runtime 依赖来审计 - 用
--format=json+jq提取最可靠:composer show --no-dev --format=json | jq -r '.packages[] | "\(.name)\t\(.version)\t\(.license // ["unknown"] | join(" | "))"'
GPL 类许可怎么触发商业风险
看到 "GPL-2.0-only" 或 "GPL-3.0-or-later" 不代表项目立刻违规,而是必须人工判断使用场景:
-
GPL-2.0-only:禁止升级到 GPL-3.0,若你项目闭源且静态链接了该库,可能被要求开源全部衍生作品 -
GPL-3.0-or-later:允许选择后续版本,但新版 GPL 对 SaaS 场景追加了 Affero 条款(AGPL),这点常被忽略 - 传染性只在“分发”时激活:内部系统不对外发布二进制,通常不触发;但 Docker 镜像上传到私有 Registry 并交付客户,就构成分发
注意:composer show 完全不区分 -only 和 -or-later,也不提示 AGPL 风险,输出里都只显示字符串。
私有包和模糊声明怎么埋雷
私有包填 "proprietary" 很常见,但法律上无效——没有内部审批记录、没签署 NDA、没做代码隔离,等于裸奔。同样危险的是模糊字段,比如:
-
"license": "custom":毫无意义,必须查原始仓库是否附带定制协议文本 -
"license": "https://example.com/license.txt":URL 可能失效,或内容早已变更,composer show不做任何校验 -
"license": ["MIT", "proprietary"]:多许可并存,你用哪条?取决于你如何集成(动态调用 vs 静态编译)、是否修改源码、是否对外分发
真正要做的不是看字段,而是确认:该包是否出现在最终交付物中?是否被用户直接调用?LICENSE 文件是否随产品一同分发?这些环节漏一个,合规链条就断了。










