目录
- go mod 介绍
- mod 相关环境变量
- 如何使用 go mod
- go.mod 文件
- go mod 命令
- go.mod 文件
- go get 升级
- go.sum
- 不同模式的命令区别
- 1. gopath模式
- 2. go vendor模式
- 2. go module模式
注:如果你的 GoLand 不会自动拉取依赖,检查一下 IDE 配置里面是不是没有启用 Go Modules。
go mod 介绍
Modules 官方定义为:
模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。
modules 替换旧的基于 GOPATH 的方法来指定在给定构建中使用哪些源文件。
mod 相关环境变量
# Modules 开关 GO111MODULE="auto" # Go 模块代理(脱离VCS版本控制方式,直接通过镜像站点来拉取) GOPROXY="https://proxy.golang.org,direct" # 国内无法访问 # 保证拉取到的模块版本数据未经过篡改 GOSUMDB="sum.golang.org" # 国内无法访问 # 私有模块配置(用于Go 模块代理无法访问到的地方,如私有库) GONOPROXY="" GONOSUMDB="" GOPRIVATE=""
如何使用 go mod
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
我们可以先设置一下 GO111MODULE 和 GOPROXY 环境变量,可以直接加到环境变量中:
GO111MODULE=on开启 go modules 功能GOPROXY设置 go 代理,下载依赖的时候可以更快地下载
go.mod 文件
启用了 Go modules 的项目,初始化项目时,会生成一个 go.mod 文件。描述了当前项目(也就是当前模块)的元信息
# module:用于定义当前项目的模块路径。
module github.com/eddycjy/module-repo
# go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
go 1.13
# require:用于设置一个特定的模块版本。
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect # indirect 标识表示该模块为间接依赖
example.com/strawberry // incompatible
)
# exclude:排除一个特定的模块版本。
exclude example.com/banana v1.2.4
# replace:用于将一个模块版本替换为另外一个模块版本。
replace example.com/banana => example.com/fish
go mod 命令
go mod download:下载依赖包go mod edit:编辑 go.modgo mod graph:打印模块依赖图go mod init:初始化新的 go module 在当前目录(嗯,是的,我们写的代码其实也等于是一个 go module)go mod tidy:拉取缺少的模块,移除不用的模块go mod vendor:将依赖复制到 vendor 下go mod verify:验证依赖是否正确go mod why:解释为什么需要依赖
go.mod 文件
module hello go 1.18
go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控。go toolchain 会在各类命令执行时,比如 go get、go build、go mod 等修改和维护 go.mod 文件。
go.mod 提供了 module,require,replace 和 exclude 四个命令。
module:指定包的名字(路径)require:指定依赖项模块replace:替换依赖模块(比如自己修改了一版,就可以使用replace将依赖替换为自己的实现,但是代码里面import路径还是旧的路径)exclude:用于排除某个包的特定版本,与replace类似,仅在当前 module 为main module时有效,其他项目引用当前项目时,exclude指令会被忽略
go module 安装依赖的原则是先拉取最新的 release tag,若无则拉最新的 commit。
go 会自动生成一个 go.sum 文件来记录 dependency tree。
go get 升级
go get -u need-upgrade-package
升级后会将新的依赖版本更新到 go.mod,也可以使用 go get -u 升级所有依赖。
- 运行
go get -u将会升级到最新的次要版本或者修订版本(x.y.z 是修订版本号,y 是次要版本号) - 运行
go get -u=patch将会升级到最新的修订版本 - 运行
go get package@version将会升级到指定的版本号 version - 运行
go get如果有版本的更改,那么go.mod文件也会更改
go.sum
这个文件记录了当前拉取的实际的版本号。可以保证我们每次拉取的都是相同的版本,除非我们手动去更新。
不同模式的命令区别
1. gopath模式
在工程经过go build、go install或 go get等指令后,会将拉取的第三方xxx依赖包放在GOPATH/src目录下
2. go vendor模式
go build 时的应用路径搜索调整成为 优先搜当前工程路径/vendor目录
2. go module模式
-
拉取依赖路径
Go Modules 模式下,下载的包是存在 $GOPATH/pkg/mod 目录下的 -
拉取指定版本
GoModules 模式下,可以下载指定版本的包
go get {模块名}@{最新版本: latest|分支: master|tag: v0.3.2|hash: 342b2e}
通常拉取到本地后,配合go mod tidy和go mod vendor就能有效的加载到我们程序中使用的包,同时会更新掉go.mod配置文件。

评论(0)