互动教程
A Tour of Go

go mod

go mod 是 Go 语言中的模块管理工具,用于处理 Go 项目的依赖关系和版本控制。它和Maven比较相似。自 Go 1.11 起,Go 引入了模块管理以替代旧的 GOPATH 模式,使依赖管理更加方便和可靠。

go module最重要的是go.mod文件的定义,它用来标记一个module和它的依赖库以及依赖库的版本。会放在module的主文件夹下,一般以go.mod命名。类似于Maven的pom.xml文件

初始化go.mod文件

1
go mod init [module-path]

如果你的项目需要发布到github上,那么module-path一定要和仓库名对应。比如github.com/{username}/{reponame}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module github.com/{username}/{reponame}

go 1.14

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(
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac = > github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 = > github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 = > github.com/golang/text v0.3.0
)
  • require:项目依赖的包
  • exclude:忽略指定版本的依赖包

  • replace:由于在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

  • incompatible 表示不兼容标识,假如其当前版本为v3.6.0,因为其Module名字未遵循Golang所推荐的风格,即Module名中附带版本信息,我们称这个Module为不规范的Module。 在使用上没有区别,如果是我们自己开发的module,需要从 xxx.com/xxx 变到 xxx.com/xxx/v2

  • indirect 是指间接依赖的包,比如 a module 使用了 b module,但b module的go.mod不完整,或者未启用 go module的话,会把未记录在b的go.mod中又依赖了的包作为间接依赖,放到a的go.mod文件里

下载依赖

1
2
3
4
5
6
7
8
# 这个命令会下载指定路径的包或模块,并将其添加到`go.mod`文件中
go get [url]

# 下载并更新到最新的次要版本或修订版本(patch version)
go get -u [url]

# 会更新到最新的修订版本
go get -u=patch [url]

添加缺少的模块并删除未使用的模块,一般用来更新 go.mod 和 go.sum 文件。

1
go mod tidy

其他的常用指令

1
2
3
4
5
6
7
8
9
go mod download:手动触发下载依赖包到本地cache(默认为$GOPATH/pkg/mod目录)

go mod graph:打印项目的模块依赖结构

go mod verify :校验模块是否被篡改过

go mod why:查看为什么需要依赖

go mod vendor :导出项目所有依赖到vendor下

vendor 文件夹是一个包含了项目所有依赖的本地副本的目录。

# support: nacos, consul, apollo, zk, etcd3  

type: file

type: nacos  
nacos:  
  server-addr: 127.0.0.1:8848  
  group: 'SEATA_GROUP'  
  namespace: ''  
  dataId: 'seataServer.properties'