Go Modules是Go 1.11引入的官方依赖管理系统,从Go 1.13开始成为默认模式。它解决了GOPATH的限制,提供了版本化的依赖管理。
# 创建项目目录
mkdir myproject
cd myproject
# 初始化模块
go mod init github.com/username/myproject
# 查看生成的go.mod文件
cat go.mod
module github.com/username/myproject
go 1.21
require (
github.com/gin-gonic/gin v1.9.1
github.com/go-sql-driver/mysql v1.7.1
)
replace github.com/old/package => github.com/new/package v1.0.0
exclude github.com/bad/package v1.2.3
# 方法1:直接在代码中import,然后运行
go mod tidy
# 方法2:使用go get
go get github.com/gin-gonic/gin@v1.9.1
# 获取最新版本
go get github.com/gin-gonic/gin@latest
# 获取特定版本
go get github.com/gin-gonic/gin@v1.8.0
# 获取特定commit
go get github.com/gin-gonic/gin@abc123
# 更新所有依赖到最新minor版本
go get -u ./...
# 更新所有依赖到最新patch版本
go get -u=patch ./...
# 更新特定包
go get -u github.com/gin-gonic/gin
# 查看可用更新
go list -u -m all
# 从代码中删除import,然后运行
go mod tidy
# 这会自动删除未使用的依赖
| 命令 | 说明 |
|---|---|
| go mod init | 初始化新模块 |
| go mod tidy | 添加缺失的依赖,删除未使用的依赖 |
| go mod download | 下载依赖到本地缓存 |
| go mod verify | 验证依赖的完整性 |
| go mod graph | 打印依赖图 |
| go mod vendor | 将依赖复制到vendor目录 |
| go mod why | 解释为什么需要某个包 |
Go Modules使用语义化版本(Semantic Versioning):v主版本.次版本.修订号
# 最新版本
go get github.com/pkg/errors@latest
# 特定版本
go get github.com/pkg/errors@v0.9.1
# 版本范围(通过go.mod)
require github.com/pkg/errors v0.9.1
# 主版本升级(v2+需要修改import路径)
go get github.com/pkg/errors/v2@latest
Vendor目录用于将依赖复制到项目中,实现完全的依赖隔离。
# 创建vendor目录
go mod vendor
# 使用vendor构建
go build -mod=vendor
# 验证vendor目录
go mod verify
# 设置GOPRIVATE环境变量
go env -w GOPRIVATE=github.com/mycompany/*
# 配置Git使用SSH而不是HTTPS
git config --global url."git@github.com:".insteadOf "https://github.com/"
# 配置.netrc文件(用于HTTPS认证)
# ~/.netrc
machine github.com
login username
password token
# go.mod
module github.com/mycompany/myproject
require (
github.com/mycompany/private-lib v1.0.0
)
Replace用于替换依赖,常用于本地开发或fork的包。
# 替换为本地路径
replace github.com/old/package => ../local/package
# 替换为其他远程包
replace github.com/old/package => github.com/new/package v1.0.0
# 替换特定版本
replace github.com/pkg/errors v0.8.0 => github.com/pkg/errors v0.9.1
# 1. 创建库项目
mkdir mathlib
cd mathlib
go mod init github.com/username/mathlib
# 2. 编写代码 math.go
package mathlib
func Add(a, b int) int {
return a + b
}
func Multiply(a, b int) int {
return a * b
}
# 3. 提交到GitHub
git init
git add .
git commit -m "Initial commit"
git tag v1.0.0
git push origin main --tags
# 4. 在其他项目中使用
go get github.com/username/mathlib@v1.0.0
# 项目结构
myworkspace/
├── app/
│ ├── go.mod
│ └── main.go
└── lib/
├── go.mod
└── lib.go
# 创建工作区
cd myworkspace
go work init ./app ./lib
# 这会生成go.work文件
# go.work
go 1.21
use (
./app
./lib
)
# 查看过时的依赖
go list -u -m all
# 测试升级(不修改go.mod)
go get -u -t ./...
go test ./...
# 确认无问题后,更新go.mod
go mod tidy
# 提交更改
git add go.mod go.sum
git commit -m "Update dependencies"
go.sum记录依赖的校验和,确保依赖的完整性和一致性。
# go.sum示例
github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=