go.mod不支持声明license,仅管理版本与路径;合规需依赖go list -m -json提取元信息并配合go-licenses等工具扫描,或在私有代理层拦截高风险协议。

go.mod 中不支持直接声明 license 协议限制
Go 的 go.mod 文件本身没有字段用于声明或校验依赖包的开源协议(如 MIT、Apache-2.0、GPL)。它只管版本、路径和替换逻辑,不解析、不验证、也不拒绝某个 license 类型的模块。这意味着:go get 或 go mod tidy 会照常下载并纳入依赖树,哪怕该模块是 GPL 协议——而你项目用的是 MIT,这可能带来合规风险。
真正起作用的是 go list -m -json + 外部扫描工具
Go 官方不内置 license 检查,但提供了足够信息供外部工具读取。关键命令是:
go list -m -json all
它会输出所有依赖模块的完整元信息,包括 License 字段(如果模块作者在 go.mod 里写了 // License: MIT 这类注释)和 Version、Replace 等。但注意:
- 这个
License字段不是强制项,大量包根本没填,返回空字符串 - 即使填了,也只是字符串,不校验是否真实匹配 LICENSE 文件内容
- 无法识别间接依赖(transitive)中嵌套的非标准协议文本
所以生产环境必须配合专用工具,比如:golicense、license-checker 或自研脚本,用正则匹配源码根目录下的 LICENSE / LICENSE.md 文件内容,再比对白名单。
私有模块或内部仓库可强制拦截
如果你控制着公司级代理(如 Nexus、Artifactory)或私有 Go proxy(如 Athens),可以在代理层做 license 拦截。例如:
- 配置规则:禁止
github.com/some/gpl-lib被任何项目go get - 对所有入站模块执行 license 文件提取 + 关键词匹配(如 “GNU GENERAL PUBLIC LICENSE”)
- 在
go mod download前触发 webhook 校验,失败则返回 403
这种方案有效,但要求基础设施支持,且对公共 proxy(如 https://goproxy.cn)不可控。
go.sum 不提供 license 信息,别指望它
go.sum 只存每个模块版本的 checksum(h1: 开头哈希),用来防篡改,跟协议授权完全无关。它不会告诉你这个 v1.2.3 是 MIT 还是 AGPL,也不会阻止你引入违反策略的模块。把它当“指纹簿”,不是“许可证登记册”。
真正容易被忽略的点是:license 合规性检查必须在 CI 阶段主动触发,不能靠 go build 或 go test 自动发现——它们压根不关心这个。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











