composer licenses --format=csv 不符合 rfc 4180 标准,字段不转义、无表头、含逗号即错位;应改用 composer show --licenses --recursive --no-dev --format=json 配合 jq 生成合规 csv。

composer licenses --format=csv 不是标准 CSV
它输出的是无表头、不转义、字段含逗号即错位的纯文本。比如 foo/bar,baz,MIT,https://example.com/LICENSE 这一行,包名里带逗号,Excel 会把它拆成三列,实际应为一列。字段里有换行或引号?直接破坏结构。这不是格式问题,是设计上就没按 RFC 4180 实现。
真正能进 CI/CD 的 CSV 必须用 --format=json + 解析
所有稳定产出都从 composer show --licenses --recursive --format=json 开始,这是唯一覆盖全部已安装依赖(含子依赖)且字段可预测的入口。后续处理要点:
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- license 字段可能是字符串(
"MIT")、数组(["MIT", "Apache-2.0"])、null或 URL("https://..."),脚本必须做类型判断 - 用
jq最简生成带表头的 CSV:composer show --licenses --recursive --format=json | jq -r ' ["name","version","license","source"], (.packages[] | [ .name, .version, (.license // "unknown" | if type == "array" then join(" / ") else tostring end), (.source.url // "") ]) | @csv ' > licenses.csv - Windows 用户若没装
jq,可用 PowerShell 替代,但注意ConvertFrom-Json对大 JSON 性能较差,建议仍优先装jq(choco install jq)
--no-dev 必须加在合规审计前
开发依赖如 phpunit/phpunit、friendsofphp/php-cs-fixer 常带 GPL 类协议,混入生产报告会导致误判。加 --no-dev 后命令变为:composer show --licenses --recursive --no-dev --format=json。注意:这个参数只过滤已安装的 dev 包,前提是 composer install 时没加 --no-dev,否则 vendor/ 里根本没这些包,自然也列不出来。
看到 "unknown" 别跳过,这才是审计重点
约 15–20% 的包 license 字段为空或写成 proprietary、unlicensed、BSD(非 SPDX 标准值)。composer show 不校验也不猜测,只原样反射。这时候得人工查该包 GitHub/GitLab 仓库根目录的 LICENSE 或 COPYING 文件——Packagist 页面上显示的许可证经常滞后或错误。别依赖自动提取,尤其对支付、加密、数据库驱动类关键依赖。










