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.mod 和 go.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 一把梭就行。