目录

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