必须提交 go.mod 和 go.sum,二者是 go 模块依赖一致性的唯一事实来源;未提交或未同步将导致构建失败或线上行为不一致,go mod tidy 是每日必做动作以保持依赖图准确,多人协作需统一 goproxy 和 goprivate 配置。

必须提交 go.mod 和 go.sum,否则协作必然出错。 这两个文件不是“可选配置”,而是 Go 模块依赖一致性的唯一事实来源。只要它们没被提交、或被忽略、或被手动编辑后未运行校验,团队中任意成员执行 go build 或 go test 都可能拉到不同版本的依赖,轻则构建失败,重则线上行为不一致。
为什么 go mod tidy 是每日必做动作
它不是“整理一下好看”,而是重新计算整个项目的依赖图:扫描所有 import 语句,删掉没被引用的 require 行,补上缺失的间接依赖,并同步更新 go.sum。不运行它,go.mod 很快就会和实际代码脱节。
- 新增一个
import "github.com/spf13/cobra"后,必须立刻运行go mod tidy,否则 CI 可能因缺少该模块而失败 - 删除某个功能并移除对应
import后,不运行go mod tidy,旧依赖仍留在go.mod中,造成“幽灵依赖”——没人用却要参与版本解析,拖慢go list -m all - 在 CI 流程里加一句
go mod tidy -v && git diff --exit-code go.mod go.sum,能卡住未同步的提交
多人同时改依赖时,go get 必须带明确版本
用 go get github.com/gorilla/mux 不指定版本,会触发 MVS(最小版本选择)算法,结果取决于你本地缓存和代理返回的“最新兼容版本”,不同人执行结果可能不同。这直接破坏可重现性。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 升级固定版本:
go get github.com/gorilla/mux@v1.8.1 - 降级也一样操作,不要依赖
-u参数,它会递归升级间接依赖,极易引入意外变更 - 避免
@latest—— 它不是语义化版本,每次解析都可能指向不同 commit,go.sum哈希也会变 - 如果必须批量更新,用
go get -u ./后,立刻go mod tidy并检查go.mod差异,确认没有非预期模块被带上
私有模块和代理配置必须统一写进文档,不能靠口头约定
当项目依赖公司内部 Git 仓库的模块时,仅靠 go.mod 里的 require internal/pkg v0.0.0-20240101000000-abc123 是不够的。如果某人没配 GOPROXY 或 GOPRIVATE,go mod download 会尝试走公共代理,然后失败。
- 所有成员必须设置:
GOPROXY=https://proxy.golang.org,direct+GOPRIVATE=git.company.com/* - 这个配置应写进项目根目录的
.envrc(若用 direnv)或Makefile的init目标里,比如:make init自动写入 shell 配置 - CI 环境也要显式注入这两个变量,不能假设 runner 默认已配好
- 验证是否生效:运行
go mod download -x,看日志里是否跳过了GOPRIVATE域名的代理请求
最常被忽略的一点是:团队里总有人在改完代码后只 git add . 却忘了 go.mod 和 go.sum 是否已更新。它们不是“生成文件”,而是你对依赖关系的主动声明——声明错了,整个构建链就不可信。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










