composer licenses 命令在 Composer 2.5+ 中已被移除,官方仅支持 composer show 配合 jq 解析 JSON 输出或直接解析 composer.lock 获取许可证信息,且必须人工核验 LICENSE 文件原文以确保合规。
composer
licenses 命令到底存不存在?
它**在官方 Composer 2.5+ 版本中已被移除**,你敲
只会看到
——这不是你装错了,是它真没了。
旧版(≤2.4)可能残留该命令,但行为不一致、输出不可靠,不能用于合规审计
所有声称“
能直接用”的教程,大概率基于过时环境或插件混淆
真正可用的原生命令只有
,且必须已执行过
(否则
为空,查不到任何包)
怎么一次性列出所有包的许可证?
用
配合
是目前最稳的方案,覆盖全部已安装包(含
),字段清晰、可脚本化:
输出为制表符分隔,方便导入 Excel 或 grep 筛选:如
处理空值,避免 jq 报错;有些包写的是
,这时值不是 SPDX 标识符,得人工核对
若要排除开发依赖,加
:
为什么不能只信 composer.json 里的 license 字段?
因为字段内容常不规范,法务审核时根本不能当真:
Composer 2.9.6
Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。
下载
值为
或
的包,必须去源码仓库翻
文件原文,确认是否真允许商用
有些包写
,但没注明全称,需手动匹配到
才算合规
更隐蔽的是:字段为空,但根目录有
,此时
不显示,得靠插件(如
)或自己读
+ 检查文件系统
想绕过 vendor 直接查锁文件行不行?
可以,而且更轻量——
是事实权威,哪怕
被删了也能跑:
注意:这个方式会漏掉
字段未声明、但实际存在 LICENSE 文件的包(比如某些历史遗留包)
如果
里
是数组(如
),
能正确展开;单字符串则原样输出
CI 流程中推荐优先用此法,不依赖 PHP 环境和 vendor 完整性
合规检查最难的从来不是命令怎么敲,而是看到
就以为万事大吉——实际上得打开 GitHub 仓库,定位到 LICENSE 文件,逐字比对条款是否含“不得用于商业用途”“必须开源衍生作品”这类限制性文字。这一步,没有任何命令能自动帮你跳过。
composer licensesCommand "licenses" is not defined.composer licenses --format=jsoncomposer showcomposer installvendor/composer show --format=jsonjqrequire-devcomposer show --format=json | jq -r '.[] | "\(.name)\t\(.version)\t\(.license // "unknown")"'monolog/monolog v3.5.0 MIT.license // "unknown""license": "https://example.com/LICENSE"--no-devcomposer show --no-dev --format=json | jq ..."proprietary""unlicensed"LICENSE"BSD-3-Clause"BSD 3-Clause LicenseLICENSEcomposer showzicht/composer-license-plugincomposer.lockcomposer.lockvendor/jq -r '.packages[] | select(.license != null) | "\(.name)\t\(.version)\t\(.license | join(" | "))"' composer.locklicensecomposer.lock.license["MIT", "Apache-2.0"]join(" | ")license: MIT