composer licenses --format=csv 不生成标准 csv 文件,而是无表头、不转义、遇特殊字符即错位的逗号分隔文本;可靠方案是用 --format=json + 脚本转为带表头和自动转义的标准 csv。

composer licenses --format=csv 不生成标准 CSV 文件
这个命令看似能导出许可证信息为 CSV,实际输出的是用逗号分隔的纯文本,**没有表头、不转义字段、遇逗号或换行直接崩格式**。你拿到的不是 Excel 可靠识别的 CSV,而是“看起来像 CSV”的字符串拼接结果。
-
composer licenses --format=csv输出每行形如monolog/monolog,MIT,https://github.com/Seldaek/monolog/blob/master/LICENSE - 一旦包名含逗号(如
foo/bar,baz)或许可证名含逗号(如BSD-2-Clause OR MIT),整行结构就错位 - 无列名,无法区分哪列是名称、哪列是许可证、哪列是链接
- Windows Excel 默认用系统区域设置解析逗号,可能把所有字段塞进第一列
真正可用的 CSV 导出:用 --format=json + 自己转
官方没提供健壮 CSV,但 composer licenses --format=json 输出稳定、带完整字段、可编程处理。这才是生产环境该走的路。
- 运行
composer licenses --format=json > licenses.json获取结构化数据 - 用 Python 一行搞定清洗+转 CSV:
python3 -c " import json, csv, sys data = json.load(open('licenses.json')) with open('licenses.csv', 'w', newline='') as f: w = csv.DictWriter(f, ['name', 'version', 'license', 'homepage']) w.writeheader() for pkg in data: w.writerow({k: pkg.get(k, '') for k in w.fieldnames}) " - 关键点:用
csv.DictWriter自动处理引号、转义、空值;writeheader()补上表头 - 字段选
name、version、license、homepage覆盖审计核心需求,比默认 CSV 输出更全
为什么不用第三方插件(如 composer-license-checker)
有插件声称支持 CSV 导出,但多数基于同源的 --format=csv 做包装,没解决根本问题:字段不可靠、无 schema、难集成到 CI 流程。
- 插件往往复用 Composer 内部未公开的 LicenseRenderer 类,升级 Composer 后容易报
Call to undefined method - 输出路径、文件名、编码(如 UTF-8 BOM)常不一致,导致 Excel 打开乱码或列偏移
- CI 中依赖额外 PHP 扩展(如 mbstring)或 Python 环境时,不如原生命令+标准工具链可控
- 真要自动化报表,直接读
composer.lock更底层可靠——它字段固定、无渲染逻辑、含 exact version 和 source URL
导出后校验 CSV 是否合格的最小检查项
别只看文件能不能打开,重点验证是否能被下游系统(如合规平台、Excel 宏、数据库导入)无损消费。
- 用
head -n 5 licenses.csv | csvformat -D '|' -v(需安装csvkit)看列对齐是否正常 - 检查首行是否为
name,version,license,homepage—— 没表头的 CSV 在自动化流程里等于废文件 - 搜
","出现位置:若在引号外出现,说明某字段含逗号但未被包裹,解析必错 - 用
file -i licenses.csv确认编码是utf-8,不是us-ascii或带 BOM 的变体










