必须立即扫描识别gpl类传染性许可证,使用go-licenses save . --save_path=third_party_licenses递归解析所有依赖并导出许可证文件,重点筛查gpl/agpl/sspl字样及无声明的高风险项,结合ci自动拦截与白名单校验确保合规。

如何快速识别项目中是否存在GPL类传染性许可证
Go项目一旦引入GPL、AGPL或SSPL许可的依赖,就可能强制要求整个项目开源——这不是警告,而是法律事实。别等法务找上门才查,现在就得动手。
用 go-licenses 扫描是最直接的方式:
go install github.com/google/go-licenses@latest go-licenses save . --save_path=third_party_licenses
它会递归解析 go.mod 中所有直接和间接依赖,并把每个包的许可证文本复制到指定目录。重点关注输出里带 GPL、AGPL、SSPL 字样的行。
- 如果某依赖没声明许可证(LICENSE 文件缺失或
go.mod里无License字段),它就是高风险项,不能上线 -
go-licenses csv .可导出表格,方便用 Excel 筛选“GPL”关键词 - 注意:有些包在 GitHub 上标 MIT,但实际分发的 zip 包里 LICENSE 是 GPL——以最终打包内容为准,不是看仓库首页
replace 能绕过 GPL 吗?不能,但能帮你替换掉它
replace 指令本身不改变许可证义务。你用 replace github.com/bad/gpl-lib => ./fork/mit-version,前提是那个 fork 确实重写了全部代码并换成了 MIT 许可证——否则只是自欺欺人。
真正可行的操作路径是:
- 先用
go mod graph | grep gpl-lib查清谁引入了该包 - 检查上游是否已有 MIT 兼容的替代品(比如用
github.com/uber-go/zap替代某个 GPL 日志库) - 若必须保留功能,且原作者不改许可证,就只能自己 fork + 彻底重写 + 显式声明新许可证,再通过
replace切过去 - 切完立刻运行
go-licenses save验证新路径下是否还残留 GPL 条目
CI 流程里怎么自动拦截含禁止许可证的依赖
靠人工 review 代码合入太晚。应该在 PR 提交时就卡住。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
在 CI 脚本里加一行校验:
go-licenses csv . | grep -iE "(GPL|AGPL|SSPL|CPAL)" && exit 1 || echo "no prohibited license found"
更稳妥的做法是生成白名单文件 allowed_licenses.txt,只允许 MIT、Apache-2.0、BSD-3-Clause 等商业友好型许可证,然后用脚本比对:
- 每次
go mod tidy后触发扫描,失败则中断构建 - 把
go-licenses save的输出存档,作为合规审计依据 - 注意:某些包会同时声明多个许可证(如 “MIT OR Apache-2.0”),这种算合规;但 “GPL-3.0-only” 就不行
为什么 go.sum 里藏不住许可证风险
go.sum 只记录哈希值,不记录许可证。它防篡改,但不防法律风险。同一个 commit hash,作者随时可以往 repo 里塞一个 GPL 声明文件,下次 go mod download 就会拉到带 GPL 的版本。
所以必须做到:
- 所有依赖都锁定具体 tag(如
@v1.2.3),避免用@master或@latest - 定期(比如每周)跑一次
go-licenses,因为上游可能悄悄改 LICENSE 文件 - 私有模块也要扫——
GO_PROXY=direct GOPRIVATE=*.company.com go-licenses save
许可证不是技术问题,是法律边界。你写的每行 go get,都可能在给公司埋雷。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










