Go 包管理详解
包管理简介
为了解决 Golang 依赖问题,类似于 Rust 的 Cargo、Node.js 的 NPM、Python 的 Pip、Ruby 的 Boundler 等,Golang 最原始的依赖管理是 go get,执行命令后会拉取代码放入 GOPATH/src 下面,但是它是作为 GOPATH 下全局的依赖,并且 go get 还不能版本控制,以及隔离项目的包依赖。
对于以上这些问题,在go mod出现之前,有dep,govendor等包管理工具的出现,但都多多少少存在缺陷。
从 Go 1.11 版本开始,官方已内置了更为强大的 Go modules 来一统多年来 Go 包依赖管理混乱的局面(Go 官方之前推出的 dep 工具也几乎胎死腹中),并且将在 1.13 版本中正式默认开启,目前已受到社区的看好和强烈推荐,建议新项目采用 Go modules。作为新入局go的同学,可以跳过旧的包管理,直接了解和使用go modules机制(即go mod系列命令)来管理包。
GO111MODULE
golang提供了一个环境变量“GO111MODULE”,默认值为auto,如果当前目录里有 go.mod 文件,就使用 go modules,否则使用旧的 GOPATH 和 vendor 机制,因为在modules机制下go get只会下载go modules。
modules和传统GOPATH不同,不需要包含src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为module,只要其中包含go.mod文件。
除了go.mod之外,go命令还维护一个名为go.sum的文件,其中包含特定模块版本内容的预期加密哈希,go命令使用go.sum文件确保这些模块的未来下载检索与第一次下载相同的位,以确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod和go.sum都应检入版本控制。
go.sum不需要手工维护,但是也可以了解一下,下面会进行介绍。
包查找顺序总结
- 如果GO111MODULE=off,那么go命令行将不会使用新的module功能,相反的,它将会在vendor目录下和GOPATH目录中查找依赖包。也把这种模式叫GOPATH模式。
- 如果GO111MODULE=on,那么go命令行就会使用modules功能,而不会访问GOPATH。也把这种模式称作module-aware模式,这种模式下,GOPATH不再在build时扮演导入的角色,但是尽管如此,它还是承担着存储下载依赖包的角色。它会将依赖包放在GOPATH/pkg/mod目录下。
- 如果GO111MODULE=auto,这种模式是默认的模式,也就是说在你不设置的情况下,就是auto。这种情况下,go命令行会根据当前目录来决定是否启用module功能。只有当当前目录在GOPATH/src目录之外而且当前目录包含go.mod文件或者其子目录包含go.mod文件才会启用。
通俗的讲:
GO111MODULE=auto,即默认情况,当然=on与=off也包含在下述情况中:
- 没go.mod文件时,属于GOPATH模式,则使用 vendor 特性
-
有go.mod文件时,此时默认启用 modules特性
- 找当前目录,不找GOPATH/src目录
- 当前目录下有vendor目录,则查找当前目录下vendor是否有此包;
- 当前目录下没有vendor目录,则查找GOROOT/src下是否有此包;
- 如果未找到,则启动GOPROXY特性,到仓库下载此包;
- 如果未下载到则提示包不存在;
包顺序:标准库 -> 项目内包 -> 内部第三方 -> 外部第三方包
具体配置方式
方式一、使用gopath
最原始的方式,也就是将项目文件创建在环境变量中配置的GOPATH中
在项目文件下创建 bin src pkg文件
src下面放置源文件
注意点
如果使用如上方式必须保证GO111MODULE=off
方式二、配置go module
使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目,包含go.mod文件的目录也被称为模块根,也就是说,go.mod 文件的出现定义了它所在的目录为一个模块
1、通过new project方式
若是通过new project方式则为普通项目想要使用go mod管理包需要进行如下操作
首先在终端执行如下代码
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
是否成功可以使用go env查询
初始化go mod 在终端执行
go mod init text
执行完成之后会形成一个go.mod文件
注意点
- 保证gopath中没有配置路径
- go module中下图地方必须勾上
2、使用 Go modules创建项目
什么也不用干,软件会帮你全部弄好