go list -json 可提取模块 License 字段和 Dir 路径,但该字段常为空或不准,需结合 Dir 手动检查真实 LICENSE 文件;应基于协议核心条款正则匹配而非文件名或字符串相等;go-licenses 工具可快速生成报告,但仍需人工复核 Unknown/Custom 项及 GPL 类传染风险。

用 go list -json 提取所有依赖的 license 信息
Go 没有内置的 license 扫描命令,但 go list -json 能导出每个模块的元数据,其中 License 字段(如果存在)通常来自 go.mod 中的 //go:license 注释或 module 行后的注释。实际中这个字段经常为空或不准确——它不解析 LICENSE 文件,也不校验内容。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 运行
go list -m -json all获取所有模块的 JSON 输出,重点看License和Dir字段 -
Dir指向本地缓存路径,可据此读取真实 LICENSE 文件(如$GOPATH/pkg/mod/cache/download/.../@v/v1.2.3.zip解压后找LICENSE、LICENSE.md、COPYING等) - 别信
License字段的字符串值,比如看到"MIT"也要手动核对文件内容是否真为标准 MIT 文本
识别常见开源协议文本的关键特征
自动匹配 license 不是比对字符串相等,而是看是否符合协议核心条款结构。例如 MIT 必须含“permission is hereby granted...”,Apache-2.0 必须有“grant of patent license”和“notice preservation”两段;GPL-3.0 则必然出现“conveying modified versions”和“copyleft”相关表述。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 用正则粗筛时,优先匹配唯一性高、不易误触的短语,比如:
Apache.*2\.0、GNU General Public License.*v3、Permission is hereby granted.*free of charge - 避免只靠文件名判断:叫
LICENSE的可能是 BSD,也可能是自定义闭源声明;叫LICENSE-MIT的也可能被篡改过 - 注意多许可证情况,如
MIT OR Apache-2.0或BSD-3-Clause AND GPL-2.0-only,这种组合必须全部满足项目合规策略
用 github.com/google/go-licenses 快速生成报告但别全信
go-licenses 是目前最常用的 Go license 检查工具,能递归分析依赖并输出 HTML/JSON 报告。但它本质仍是基于 go list -json + 文件名启发式匹配,不真正解析协议文本语义。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 安装后运行
go-licenses csv ./...或go-licenses html ./...,重点关注 “License Type” 列为空、为 “Unknown” 或标为 “Custom” 的条目 - 对 “Unknown” 项,手动进入
Dir路径,用head -n 50 LICENSE | grep -i "copyright\|permission\|grant"快速定位关键句 - 它会把
golang.org/x/net这类官方包标为 “BSD-3-Clause”,但实际其go.mod中写的是 “BSD”,且 LICENSE 文件内容与标准 BSD-3-Clause 一致——这种可以接受;但若发现某包标 “MIT” 却无 copyright 声明,则必须人工复核
规避 GPL 类协议在静态链接场景下的传染风险
Go 默认静态链接所有依赖,这意味着如果引入了 GPL-2.0-only 或 AGPL-3.0 的包(哪怕只是间接依赖),整个二进制可能被要求开源。而 Go 生态里很多工具链包(如某些 parser、codegen 工具)用的是 GPL,但仅用于构建期,不进入最终产物。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 区分使用场景:构建期工具(放在
tools.go中)和运行时依赖。前者可用//go:build tools标记隔离,不参与主模块 license 评估 - 检查
go mod graph输出,确认 GPL 包是否真的出现在主模块依赖路径上,还是只挂在golang.org/x/tools下的子图里 - 遇到
github.com/elastic/go-elasticsearch这类明确声明“仅限 Elasticsearch 官方客户端”的包,即使 license 是 Apache-2.0,也要看其 NOTICE 文件是否附加额外限制
go list 输出里,它就安静地躺在某个 zip 包的第三层子目录 LICENSE 文件里。人工抽样检查不能省,尤其当项目要上生产或过法务审计时。










