Go Module
go module是 Go 语言中正式官宣的项目依赖管理工具,在go1.13版本逐渐走向成熟,推荐后续直接使用即可。
go module提供的命令
在 Go modules 中,我们能够使用如下命令进行操作:
命令 | 作用 |
---|---|
go mod init | 生成 go.mod 文件 |
go mod download | 下载 go.mod 文件中指明的所有依赖 |
go mod tidy | 整理现有的依赖 |
go mod graph | 查看现有的依赖结构 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 导出项目所有的依赖到 vendor 目录 |
go mod verify | 校验一个模块是否被篡改过 |
go mod why | 查看为什么需要依赖某模块 |
GOPROXY
这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时能够脱离传统的 VCS 方式,直接通过镜像站点来快速拉取。
GOPROXY 的默认值是:
https://proxy.golang.org,direct
,这有一个很严重的问题,就是
proxy.golang.org
在国内是无法访问的,因此这会直接卡住你的第一步,所以你必须在开启 Go modules 的时,同时设置国内的 Go 模块代理,执行如下命令:
$ go env -w GOPROXY=https://goproxy.cn,direct
开启go module
如果你不确定你当前的值是什么,可以执行
go env
命令,查看结果:
$ go env
GO111MODULE="off"
...
如果需要对 GO111MODULE 的值进行变更,推荐通过
go env
命令进行设置:
$ go env -w GO111MODULE=on
初始化项目
运行go mod init命令,给出您的模块路径——在这里,使用example.com/greetings。如果发布模块,这必须是Go工具可以从中下载模块的路径。这将是您的代码的存储库。
$ go mod init example.com/greetings
go: creating new go.mod: module example.com/greetings
go.mod 文件
为了更进一步的讲解,我们模拟引用如下:
module github.com/eddycjy/module-repo
go 1.13
require (
example.com/apple v0.1.2
example.com/banana v1.2.3
example.com/banana/v2 v2.3.4
example.com/pear // indirect
example.com/strawberry // incompatible
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/fried v0.1.0
replace example.com/banana => example.com/fish
- module:用于定义当前项目的模块路径。
- go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
- require:用于设置一个特定的模块版本。
- exclude:用于从使用中排除一个特定的模块版本。
- replace:用于将一个模块版本替换为另外一个模块版本。
另外你会发现
example.com/pear
的后面会有一个 indirect 标识,indirect 标识表示该模块为间接依赖,也就是在当前应用程序中的 import 语句中,并没有发现这个模块的明确引用,有可能是你先手动
go get
拉取下来的,也有可能是你所依赖的模块所依赖的,情况有好几种。
参考附录:
[1] 脑子进煎鱼:https://golang2.eddycjy.com/posts/appendix/01-go-modules-use/
[2] go官方教程:https://golang.google.cn/doc/tutorial/create-module