Modules是什么

Golang从诞生之初就一直有个被诟病的问题:缺少一个行之有效的“官方”包依赖管理工具。其原因是在Google内部,所有人都是在一个代码库上进行开发的,因此并不是非常需要。但Golang变成一个社区化的工程语言之后,这个问题被放大了。

  1. GOPATH不符合一般开发者习惯,大部分人更习惯maven、node modules、Nuget之类的包管理方式
  2. GOPATH无法有效的管理版本依赖,没有一个地方能够表明依赖包的具体版本号,无法形成有效的版本配套关系

在Golang 1.5发布了vendor特性之后,社区在vendor基础上开发了很多包管理工具,例如glide, dep(这个最悲催,已经半官方了,结果横刀杀出来一个go mod),等等,具体参见拙文go依赖包管理工具对比 。但说实话,都不是非常满意。 

而Golang 1.11 版本引入的 go mod ,其思想类似maven:摒弃vendor和GOPATH,拥抱本地库。我们今天就来尝试使用该种方式来进行本地包管理。

为了简化操作我们使用goland来进行详细操作:

不使用modules流程:

package main

import (
	"github.com/gogf/gf/g/encoding/gjson"
)

func main() {

}


func GetText(data string) string {
	if j, err := gjson.DecodeToJson([]byte(data)); err != nil {
		panic("Get Text Error")
	} else {
		var result = j.GetString("results.0.values.text")
		return result
	}
}

默认使用 /home/go 作为GOPATH 的下载地址并引用

 我们这里打开Modules设置:

Create go.mod file 点击后生成 go.mod文件跟命令是一样的效果:

​​​​​go mod init [你的项目名]

新创建文件内容如下:
module "demo"

之后在需要引用的包下面 option+空格

 

从原来的GOPATH变更为Gi Modules

go.mod文件:

module demo

go 1.12

require github.com/gogf/gf v1.6.9

生成go.sum:

github.com/gogf/gf v1.6.9 h1:23jjC/oY1E1BNVMZ8wB1jkA3tT2BEtwdf/lHwxB2yjI=
github.com/gogf/gf v1.6.9/go.mod h1:qJRcq0s3RskjJIZKsSHjZkpxw91rd0EAh+4CUbawbXQ=

go.sum是一个模块版本内容的校验值,用来验证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,比go.mod要多一些。 

依赖包下载位置 

 禁用GOPATH:

设置构建选项: