「go module」一文总结 go mod 入门使用
文章目录
- 什么是 Go Modules
- 为什么要使用 Modules
- 怎么使用
- 前置条件
- 项目初始化
- 如何安装/管理依赖?
- 依赖安装 go get
- 版本选择方式
- 替换版本 replace
- 间接依赖 && go mod tidy
- 远程代理
- 总结
什么是 Go Modules
Module 是 Go 的依赖管理工具。
核心概念
- Modules 模块
定义:简易来说,go.mod 文件所处的根目录即为模块,一个 modules 中包含了多个 package。 - Package 包
一个文件夹下的多个 go 文件构成了一个包,每个文件顶部都有 package xxx 的声明文件所属的包 - Version 版本
一个版本标识模块的一个不可变快照,每个版本以 v 开头。版本包括 主版本号、次版本号、补丁版本号等。
在 Go Modules 中,每次创建一个大版本,必须创建一个新的子目录。如 github.com/pelletier/go-toml/v2
为什么要使用 Modules
简单来说,go Modules 大势所趋。
从历史来说,在 Modules 之前,使用 vendor进行包管理。vendor 的管理方式非常简单, 将项目的所有依赖项复制到本项目的 vendor 目录下,需要时首先从 vendor 目录中寻找。
vendor 的缺点非常明显,当你将依赖下载到 vendor 目录下时,是无法指定版本的,而且你也很难感知到自己所下载的依赖版本。
Modules 提供的一个核心能力就是对依赖版本的管理。
怎么使用
前置条件
-
go 版本 >= 1.11
-
设置 GO111MODULE && go proxy
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
开启 go111Module 之后,go 会在 modules 根目录下找依赖,而不会去 gopath 中找,当前默认值时auto。
项目初始化
go mod init 初始化一个模块,该命令生成一个 go mod 文件,管理依赖项。
如何安装/管理依赖?
依赖安装 go get
go get 命令下载、编译、安装,命令如下
go get dependenct@version
go get 会将依赖安装到 $gopath/pkg/mod,可以通过@指定版本号
同时,go get 还可以对依赖进行更新,命令如下
go get -u dependece
使用上述 go get 命令时,go modules 会自动更新 go.mod记录新的依赖项。
版本选择方式
安装依赖时,对版本的选择有多种方式:通配符匹配、比较运算符、精确版本。
- 通配符 ( * )
- 匹配任意数字或者字符,例如 v1.2.* 可以匹配任意版本
- 比较版本
- > 大于某版本
- >= 大于等于某版本
- < 小于某版本
- <= 小于等于某版本
- != 不等于某版本
- -:范围 v1.0-v1.3(包含边界)
- 精确版本
- 直接使用具体的版本号 v1.2.3
替换版本 replace
go mod repalce module replacement
将 module 替换为 replacement
go mod replace github.com/example/foo v1.2.3
更换版本
go mod replace github.com/example/bar …/some-local-module
更换为本地版本
使用 go mod replace 之后,需要使用 go mod tidy 更新 go mod go sum 文件。
一般是用于测试。其他场景避免使用
间接依赖 && go mod tidy
-
直接依赖:直接依赖是您在项目的
go.mod
文件的require
部分明确列出的依赖项。这些依赖项通常是您在代码中直接导入并使用的模块,它们是您项目直接依赖的模块。 -
非直接依赖:非直接依赖是其他模块的依赖项,也就是您项目的直接依赖项所依赖的模块。这些非直接依赖项不会在您项目的
go.mod
文件的require
部分中列出,而是在其他模块的require
部分中列出。
go mod tidy
命令是 Go Modules 中的一个命令,用于维护和更新项目的 go.mod
和 go.sum
文件,以保持依赖项的一致性和正确性。
在执行 go mod tidy
命令时,Go 编译器会增加缺失的依赖、删除未使用的直接依赖项、更新直接依赖项的版本、更新 go.sum
文件
远程代理
Go Modules 支持使用远程代理来加速模块的下载和构建过程,简单来说无法直接访问 Go 官网时通过代理进行下载。具体命令
go env -w GOPROXY=https://goproxy.cn,direct
配置完成后,通过 go get
、go mod tidy
时,首先使用代理网站下载更新依赖。
总结
我对 Go Modules 的理解,通过 Modules 实现了对依赖的版本控制,所有的依赖默认下载在 $GoPath/pkg/mod 下,Modules 通过 go.mod 文件指明当前项目所使用的依赖及其具体版本。