文章目录
- 一、Go Module 概述
- 二、Go Module 核心特性
- 1. 项目结构
- 2. 依赖查找机制
- 三、如何启用 Go Module
- 四、创建 Go Module 项目
- 五、Go Module 关键命令
一、Go Module 概述
Go Module 是 Go 1.11 版本(2018 年 8 月)引入的依赖管理系统,用于替代传统的 GOPATH 模式。其核心目标是解决 GOPATH 模式下的依赖版本控制问题和工作目录污染问题,使项目可以在任意路径下独立管理依赖,无需强制遵循 GOPATH 结构。
适用版本
- Go 1.11~1.13:需通过环境变量
GO111MODULE
手动开启(默认值为auto
)。 - Go 1.14+:默认启用 Go Module,逐步淘汰对 GOPATH 模式的依赖。
- Go 1.16+:推荐在生产环境中使用。
二、Go Module 核心特性
1. 项目结构
- 核心文件:每个 Go Module 项目的根目录必须包含一个
go.mod
文件,用于描述模块名称、Go 版本和依赖关系。module gitee.com/infraboard/go-course // 模块名称(唯一标识) go 1.16 // 项目使用的 Go 版本
- 依赖存储:依赖包默认下载到
$GOPATH/pkg/mod
目录,而非直接存放在项目路径中,避免污染工作目录。
2. 依赖查找机制
开启 Go Module 后,编译器按以下顺序搜索依赖包:
- 当前项目路径:模块名称打头的包(如
gitee.com/infraboard/go-course/day1/compile/pkg
)。 - 缓存目录:
$GOPATH/pkg/mod
下的预编译依赖包。 - Go 安装目录:
$GOROOT/src
下的标准库包。
对比 GOPATH 模式:Go Module 完全忽略 GOPATH 中的 src
目录(除标准库外),仅通过 go.mod
管理依赖,解决了多项目依赖冲突问题。
三、如何启用 Go Module
Go Module 的开关由环境变量 GO111MODULE
控制(Go 1.16+ 版本默认值为 on
,无需手动设置):
# 查看当前值
go env GO111MODULE
# 手动设置(Go 1.11~1.15 需注意):
# on:强制启用 Go Module(推荐新项目使用)
# off:强制禁用,使用传统 GOPATH 模式(兼容旧项目)
# auto:自动判断(项目含 go.mod 则启用,否则使用 GOPATH)
go env -w GO111MODULE=on
四、创建 Go Module 项目
步骤 1:新建项目目录(非 GOPATH 路径)
mkdir my-go-module-project
cd my-go-module-project
步骤 2:初始化 Go Module
# 使用模块名称初始化(模块名称通常为项目的代码仓库地址)
go mod init example.com/my-project
执行后会生成 go.mod
文件,内容类似:
module example.com/my-project
go 1.16
步骤 3:编写代码并管理依赖
- 在项目中直接编写代码,无需将文件放入
src
目录。 - 通过
go get
命令添加依赖,依赖会自动写入go.mod
和go.sum
(记录依赖哈希值,确保一致性)。go get github.com/jinzhu/gorm@v1.20.1 # 指定版本获取依赖
五、Go Module 关键命令
命令 | 作用描述 |
---|---|
go mod init | 初始化模块,生成 go.mod 文件 |
go mod tidy | 清理无效依赖,自动添加缺失依赖 |
go mod vendor | 将依赖复制到项目本地的 vendor 目录(用于离线编译) |
go get [package] | 获取并更新依赖包(可指定版本,如 @v1.0.0 ) |
go mod graph | 查看依赖关系图 |
- 版本控制:通过
go.mod
和go.sum
精确管理依赖版本,避免版本混乱。 - 独立项目:项目可在任意路径下创建,无需受限于 GOPATH 结构。
- 依赖隔离:依赖存储在统一缓存目录(
$GOPATH/pkg/mod
),避免项目间依赖污染。 - 兼容性:通过
GO111MODULE=auto
无缝兼容旧版 GOPATH 项目。