Go Module

  • Post author:
  • Post category:其他




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



版权声明:本文为Ming_360原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。