工程与依赖管理
模块依赖怎么加、怎么收干净,以及和容器部署的衔接。
go get 与 go mod tidy
go get github.com/some/lib@v1.2.3
go get github.com/some/lib@latest
go mod tidy # 按源码引用增删依赖,并维护 go.sum
go list -m all # 查看模块图
go.mod:声明模块路径、Go 版本、require依赖go.sum:依赖内容校验和,应提交到版本库- 升级大版本(路径含
/v2等)要改 import 路径,不只是改版本号
删除代码里的引用后执行 go mod tidy,无用依赖才会从 go.mod 消失。
版本选择直觉(MVS)
Go 使用最小版本选择(Minimal Version Selection):
- 构建取各依赖约束中的最小满足版本,而不是「尽量最新」
- 结果更可复现,依赖图更简单
- 需要新特性时显式
go get升到目标版本
go.mod 里的 go 1.22 表示该模块使用的语言/工具链版本约定;本地工具链应兼容。
工作区与多模块
单仓库多模块时,可用 workspace:
go work init ./services/api ./pkg/common
生成 go.work(通常不提交或按团队约定;本地联调友好)。小项目一个 go.mod 足够,不必过早拆模块。
替换依赖调试:
replace example.com/lib => ../lib
临时本地替换很有用;合并前记得确认是否仍需要。
与 Docker 的衔接
容器里常用官方镜像编译/运行:
FROM golang:1.22-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .
FROM alpine:3.20
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]
要点:先拷 go.mod/go.sum 以利用层缓存;生产二进制常用 CGO_ENABLED=0 静态链接。更完整的镜像与 Compose 通识见工程实践「Docker 基础」。
小结
go get加依赖,go mod tidy收敛,go.sum入库- MVS:可复现优先,升级要显式
- 多模块再用
go work;单模块别过度设计 - Docker 多阶段构建 + 依赖层缓存是常见部署姿势