go-licenses 需手动安装且依赖环境配置:用 go install 安装、确保 $GOPATH/bin 在 PATH 中;默认仅扫直接依赖,缺 license 时需加 --include-submodules 或手动补全;推荐用 JSON 输出避编码问题;CI 中应先 go mod download 并加 --skip-errors。

go-licenses 命令找不到或报错 command not found
说明:这不是 Go 标准工具,需要单独安装。很多人直接敲 go-licenses 就失败,因为没装、没加到 PATH,或者装错了版本。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 用
go install github.com/google/go-licenses@latest安装(Go 1.21+ 推荐方式);旧版 Go 可能需先启用GO111MODULE=on - 安装后二进制默认在
$GOPATH/bin,确认该路径已加入系统PATH,否则 shell 找不到命令 - 别用
go get -u—— 它已被弃用,且对某些模块会拉取错误的 commit - 如果提示
no required module provides package,说明当前目录不在 module 内,先运行go mod init example.com/foo或 cd 到含go.mod的项目根目录
生成的 license 文件里缺关键依赖或 License 字段为空
说明:go-licenses 默认只扫描直接依赖(require 块),且对无明确 LICENSE 文件或未声明 license 字段的包,常跳过或留空。不是 bug,是设计如此。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 加
--include-submodules参数可递归扫描间接依赖(但会显著变慢,且可能引入大量无关包) - 用
--json输出再配合jq过滤,比 HTML/Text 更可靠:go-licenses csv --json | jq '.[] | select(.License == "")' - 某些包(如
golang.org/x/...)的 license 信息藏在源码注释里,go-licenses 不解析注释,只能手动补 - 若项目用了
replace或exclude,go-licenses 仍按go list -deps结果工作,不会自动跳过被 exclude 的包
输出格式混乱、中文乱码或表格列错位
说明:go-licenses 的 csv 和 html 模式对非 ASCII 字符支持弱,尤其 Windows 终端或某些 IDE 内置终端默认编码不匹配。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 优先用
go-licenses json,然后用脚本转成你需要的格式(Python / jq 都行),避开编码陷阱 - Linux/macOS 下避免直接重定向到文件(
> licenses.csv),改用go-licenses csv > /tmp/out.csv,再用iconv转码 - HTML 模式生成的
index.html不带 charset 声明,浏览器可能误判编码;手动打开后另存为 UTF-8 编码即可 - CSV 中字段含换行或逗号时,go-licenses 不做转义 —— 别拿 Excel 直接双击打开,用 LibreOffice 或代码读取更稳
CI/CD 流水线里 license 检查总失败
说明:go-licenses 对模块缓存、GOPROXY、网络策略敏感,CI 环境常禁网或用私有 proxy,导致部分包元数据拉不到,进而 license 字段为空或报错退出。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- CI 中先运行
go mod download,确保所有依赖已缓存,再跑go-licenses - 用
--skip-errors让它遇到无法识别 license 的包时继续,而不是直接 exit 1 - 不要把
go-licenses html当作唯一合规证据 —— 它只是辅助,真正要审计的是go.sum对应的 commit 和源码根目录下的 LICENSE 文件 - 如果公司要求必须包含某几个特定 license(如 Apache-2.0、MIT),写个简单脚本检查 JSON 输出里是否缺失,比依赖 go-licenses 自带的校验更可控
license 扫描从来不是“运行一个命令就完事”的事。最麻烦的永远是那些没放 LICENSE 文件、用注释写 license、或者 fork 后改了协议却没更新声明的包 —— go-licenses 不会替你读人话,它只读它能找到的机器可识别信号。










