Go mod 项目依赖管理
目录
一、为什么需要Go Modules?
传统 GOPATH 痛点
# 典型报错场景
$ go get ./...
package github.com/xxx/yyy: code in directory /go/src/github.com/xxx/yyy
expects import "zzz" # 包路径强绑定问题
# 项目隔离困难
ProjectA 需要 v1.2.3
ProjectB 需要 v2.0.0 # 版本冲突无解
拉取项目依赖时,出现依赖版本冲突的情况;有些依赖版本过高或者过低,出现冲突不兼容的情况
二、Go Modules核心优势
-
项目独立依赖:不会出现项目冲突的情况
-
版本控制:指定依赖的版本
-
可重复构建:多次构建不会出现依赖报错问题,
-
私有化依赖:将第三方依赖私有化,支持自定义修改,并且避免第三方库close的情况
三、快速入门
- 创建一个web项目
创建一个目录,在目录下创建一个 main.go,代码如下,开启一个 web 平台
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
- 开启 module 管理
# windows 开启,推荐使用 GO111MODULE=auto
go env -w GO111MODULE=on
# mac、linux 推荐使用 GO111MODULE=auto
export GO111MODULE=on
# Goland 开发工具开启(推荐)
file->setting->go->go Modules
打勾-Enable Go Modules integration
- 使用 go mod 管理依赖
# 进入项目根目录,初始化 go mod,生成项目的 .mod 和 .sum 文件
go mod init
# 整理依赖
go mod tidy
# 下载依赖,默认是下载到 $GOPATH/src 目录下
go mod download
.mod 文件是项目依赖版本控制
到这里就已经成功使用 Go Modules 管理项目依赖了
四、核心命令详解
命令 | 应用场景 |
---|---|
go mod init | 初始化模块 |
go mod tidy | 整理.mod文件依赖 |
go mod download | 下载依赖 |
go mod vendor | 生成 vendor 目录,存放项目依赖 |
go list -m all | 查看完整依赖树 |
go mod why | 可视化依赖冲突 |
go mod graph | 查看依赖关系 |
五、Mod 文件详解
// 项目目录
module github.com/company/project
// go 的版本
go 1.20
require (
github.com/gin-gonic/gin v1.9.1
gorm.io/gorm v1.25.2
)
// 依赖替换,一般用在本地依赖调试,或者依赖加速
replace (
// 本地调试替换
github.com/company/private-mod => ../private-mod
// 镜像加速
golang.org/x/text => github.com/golang/text v0.3.8
)
exclude (
// 排除问题版本
github.com/mattn/go-sqlite3 v1.14.0
)
module 语句指定包的名字(路径) require 语句指定的依赖项模块 replace 语句可以替换依赖项模块 exclude 语句可以忽略依赖项模块
官方说明:除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希 go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。 go.sum 不需要手工维护,所以可以不用太关注。
注意:子目录里是不需要init的,所有的子目录里的依赖都会组织在根目录的go.mod文件里
常见问题
1. 如何回退依赖版本?
# 查看历史版本
go list -m -versions github.com/gin-gonic/gin
# 回退到指定版本
go get github.com/gin-gonic/gin@v1.8.2
或者直接修改 mod 文件依赖的版本
2. 出现checksum不匹配怎么办
# 删除校验缓存
go clean -modcache
# 重新下载依赖
go mod tidy
3. 如何迁移GOPATH项目?
# 在项目根目录执行
go mod init
go mod tidy