要使他人能直接 go get 你的 Go 包,模块名必须与 GitHub 仓库路径完全一致(如
module github.com/yourname/mylib),且需打符合 vMAJOR.MINOR.PATCH 格式的 Git tag(如 v1.0.0);私有域名需配置 GOINSECURE,go.mod 中 require 必须可公开解析,replace 仅限本地调试使用。

能直接 go get 你的包,前提是它符合 Go Module 的语义化版本规则,并且 GitHub 仓库路径和模块名一致——不满足任一条件,别人 go get 就会失败或拉错代码。
模块名必须和 GitHub 仓库地址完全匹配
Go 不靠域名或镜像判断来源,只认 go.mod 里写的模块路径。比如你的仓库是 https://github.com/yourname/mylib,那 go.mod 第一行必须是:
module github.com/yourname/mylib
常见错误现象:
- 写成
module mylib或(但没打 v2 标签)→module github.com/yourname/mylib/v2go get会报unknown revision - 用私有域名(如
git.mycompany.com)但没配GOINSECURE→go get直接超时或拒绝连接
使用场景:只要别人执行 go get github.com/yourname/mylib,Go 就会按这个路径去 GitHub 拉源码、读 go.mod、解析依赖。
立即学习 “go 语言免费学习笔记(深入)”;
必须打 Git tag 才算“发布”
Go Module 默认只识别带前缀 v 的 tag,比如 v1.0.0、v2.3.1。没有 tag,go get 拉到的是 latest commit,但无法指定版本、不能被 go.sum 锁定,也不算稳定发布。
实操建议:
- 用
git tag v1.0.0打标签,再git push origin v1.0.0推上去 - 版本号必须符合
vMAJOR.MINOR.PATCH格式,v1或v1.0都不合法 - 如果升级了不兼容 API,必须升
MAJOR并在模块名末尾加/v2(同时打v2.0.0tag)
性能影响:没 tag 时,go mod tidy 会反复 fetch commit log;有规范 tag 后,Go 会缓存 checksum 并跳过冗余解析。
go.mod 文件里别漏掉 require 和 replace
如果你的包依赖了尚未发布的内部模块,或想强制指定某个 fork 版本,require 和 replace 得写清楚,否则别人 go get 时会卡在找不到依赖。
常见错误现象:
-
go.mod里有require example.com/private v1.0.0,但该地址不可公开访问 →go get失败 - 本地开发用了
replace github.com/xxx => ../xxx,但提交时忘了删 → 别人拉下来编译报no matching versions
实操建议:
- 发布前运行
go mod tidy,确保所有require行都能被公共网络解析 -
replace只应在本地调试时用,提交前务必删掉或注释掉 - 如果依赖私有模块,考虑改用
go mod edit -replace临时替换,而非硬编码进go.mod
最容易被忽略的是:GitHub 仓库默认分支名(比如 main 而非 master)会影响 go get 的 fallback 行为——当没指定版本时,Go 会尝试拉默认分支,但如果该分支没 go.mod 或模块名不对,就静默失败。所以发布后,记得用 go get github.com/yourname/mylib@v1.0.0 实测一次,别只信 README 里的命令。