Go语言:使用Go Modules管理依赖

Go Modules 是 Go 1.11 引入、Go 1.16 默认启用的依赖管理方案,彻底告别了 GOPATH 时代。这篇简短记录常用操作。

初始化模块

mkdir myproject && cd myproject
go mod init github.com/yourname/myproject

这会生成 go.mod 文件:

module github.com/yourname/myproject

go 1.17

添加和管理依赖

直接在代码里 import,然后执行 go mod tidy,Go 会自动下载依赖并更新 go.modgo.sum

go mod tidy

go.sum 记录了每个依赖的哈希值,用于校验完整性,应该提交到版本控制。

手动添加特定版本:

go get github.com/gin-gonic/gin@v1.7.7

go.mod 常用指令

module github.com/yourname/myproject

go 1.17

require (
    github.com/gin-gonic/gin v1.7.7
    github.com/go-redis/nedis/v8 v8.11.4
)

// 本地开发时替换为本地路径
replace github.com/yourlib/utils => ../utils

// 排除有问题的版本
exclude github.com/some/lib v1.0.1

replace 在本地开发多模块项目时特别有用,不需要每次都 push 到远程再 go get。

vendor 目录

有些团队喜欢把依赖放进仓库:

go mod vendor
go build -mod=vendor ./...

vendor/ 目录会包含所有依赖的源码副本。CI 环境中这样做可以避免网络依赖。

私有模块

访问私有仓库时需要配置 GOPRIVATE:

go env -w GOPRIVATE=github.com/yourcompany/*

同时确保 Git 配置了正确的认证:

git config --global url."git@github.com:".insteadOf "https://github.com/"

版本选择

Go Modules 使用 最小版本选择(MVS) 算法:如果 A 依赖 X v1.2,B 依赖 X v1.3,Go 会选择 v1.3(满足所有约束的最小版本),而不是直接拉最新版。这让构建更可预测。

查看依赖关系:

go mod graph

查看某个包为什么被引入:

go mod why github.com/some/package

基本就这些,Go Modules 的设计思路是尽量简单,大部分时候 go mod tidy 一把梭就行。