golangci-lint 输出 JSON 报告必须用 --out-format=json 配合 shell 重定向(如 > report.json)或 tee,不可用 -o 参数,因其会混入 ANSI 转义符导致解析失败;空报告为合法 [],需用 jq 等工具安全解析。

golangci-lint 输出 JSON 报告用 --out-format=json
直接加这个参数就能导出标准 JSON 格式,不是自定义模板,也不是需要额外插件。它输出的是一个 JSON 数组,每个元素对应一条 lint 问题,字段包括 severity、source、line、column、message、linter 等。
常见错误是误用 --format=json(旧版参数,已弃用)或试图用 -o report.json 直接重定向——这会把 ANSI 颜色码和非 JSON 内容一起写进去,导致解析失败。
- 正确命令:
golangci-lint run --out-format=json > report.json - 若需同时看终端输出又保存 JSON,用
tee:golangci-lint run --out-format=json | tee report.json - 注意:JSON 输出不包含
stdout的提示文字(如 “Found N issues”),只有纯问题数组
为什么 golangci-lint run -o report.json 生成的不是合法 JSON
因为 -o 是写入“格式化后的报告文本”,默认是 colored-line-number 格式,哪怕你后面加了 --out-format=json,-o 仍会覆盖并写入带颜色控制符的字符串流。最终文件开头常混有 \x1b[31m 这类 ANSI 转义序列,JSON 解析器直接报错 invalid character '\x1b' looking for beginning of value。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
-
-o和--out-format是互斥配置,不能组合使用 -
-o只适合生成 HTML、checkstyle、junit 等预设格式(需配合对应--out-format值),但 JSON 不在-o支持列表里 - 真正安全的落地方式只有 shell 重定向或
tee
CI 场景下解析 JSON 报告要注意编码和空结果
CI 脚本(比如 GitHub Actions 或 GitLab CI)里读取 report.json 时,容易忽略两个边界情况:一是报告为空(没发现问题),JSON 文件内容是空数组 [],不是空文件;二是某些 shell 环境默认不处理 UTF-8 BOM 或换行符,导致 jq 解析失败。
立即学习“go语言免费学习笔记(深入)”;
- 检查是否为空报告:
jq 'length == 0' report.json比test -s report.json更准确 - 过滤严重问题:
jq 'map(select(.severity == "error"))' report.json - 确保 jq 版本 ≥ 1.6(低版本不支持
--compact-output等关键选项) - 如果 golangci-lint 因配置错误提前退出(如
.golangci.yml语法错),根本不会生成 JSON,得先捕获命令退出码
自定义 JSON 字段?只能靠 post-process
golangci-lint 不提供字段增删或嵌套结构定制,--out-format=json 输出是固定 schema。如果需要添加 project_name、commit_hash 或合并多个包的结果,必须用外部工具加工。
- 加元数据示例(用 jq):
jq --arg commit $(git rev-parse HEAD) '{commit: $commit, issues: .}' report.json > enriched.json - 合并多个子模块报告:
jq -s 'add' module-a.json module-b.json > all.json - 注意:原始 JSON 中
path字段是相对路径,CI 中可能需补全为绝对路径,否则 IDE 或前端展示定位失败
-o 和 --out-format 混用,以及没意识到空报告仍是合法 JSON。只要坚持用重定向 + jq 后处理,基本不会掉坑里。

















