用 replace 可绕过远程拉取实现本地修改立即生效,但需注意路径相对性、ci 清理、goproxy 配置及 goprivate 设置以避免代理拦截。

用 replace 绕过远程拉取,本地改完立刻生效
多仓库协作时最耗时间的不是写代码,而是“改一行、发 tag、更新依赖、再测试”这个闭环。根本原因在于 Go 默认按 import path 去远程 fetch,不认你本机刚改的代码。
直接在主模块的 go.mod 末尾加 replace,就能让构建跳过网络,直连本地路径:
replace github.com/yourorg/pkg => ../pkg
-
../pkg必须是完整模块目录,且含合法go.mod(module github.com/yourorg/pkg) - 路径必须相对于当前
go.mod,别用绝对路径——CI 里会失效 - 执行
go mod tidy后,go list -m all应显示github.com/yourorg/pkg => ../pkg -
GOPROXY设为direct或确保它不拦截replace路径,否则可能被绕过
go get -u=patch 只升补丁,不碰次要版本
当你依赖多个内部仓库共享的基础模块(比如 github.com/company/log),盲目 go get -u 会把 v1.2.3 升到 v1.3.0,而你只想收 v1.2.4 这类 bugfix。
-
go get -u=patch:只升级补丁号,v1.2.3 → v1.2.5✅,v1.2.3 → v1.3.0❌ -
go get -u等价于-u=minor,会升次要版本,风险更高 - 该参数从 Go 1.19 起支持,低于此版本无效
- 建议在 CI 脚本里显式写死,避免因 Go 版本差异导致行为不一致
CI 构建前必须清理 replace,否则构建失败
replace 是开发期临时方案,CI 环境没你本地的 ../pkg 目录,硬留着会报 cannot find module。
- 发布前手动删掉
go.mod里的replace行——别指望自动化工具帮你做这事 - CI 中可加
GOFLAGS="-mod=readonly",让go build在发现replace时直接报错,提前暴露问题 - 若用
go work管理多模块,replace不再必要,但需确保所有子模块已git add并提交,否则工作区无法识别 -
go.sum里会存本地路径的校验和,但它不会上传,所以不影响远端构建一致性
私有仓库必须配 GOPRIVATE,否则代理拦路
公司内网 Git 地址(如 git.internal.company.com/lib)默认会被 GOPROXY 尝试转发,结果 404 或权限拒绝。
- 设环境变量:
GOPRIVATE=git.internal.company.com/*(支持通配符) - 同时配
GONOSUMDB=git.internal.company.com/*,跳过校验(若无签名机制) - 这两个变量要进 CI 配置,不能只设在本地 shell
- 验证是否生效:运行
go env | grep -E "(GOPRIVATE|GONOSUMDB)"
真正麻烦的不是配置本身,而是不同仓库的 import path 命名不统一、go.mod 里 module 声明和实际路径对不上——这种错误不会报语法错,但会让 replace 完全失效,且很难一眼看出。











