Golang使用将近有一年多了,期间使用Golang做过不少项目,使用中对其愈发喜爱,一个词概括,真香!闲话少说,下面进入主题。
用过Java的都知道Java有maven,gradle等代码依赖管理工具,使用这些工具,你只需要添加依赖,在构建时,会自动下载对应的包并在项目中集成。我们可以控制使用的包的版本还有兼容性,选择自己项目需要的包进行下载使用。
Go Module 是 Go 语言的一种依赖管理方式,在 Go 1.11 版本中出现的,在1.13版本前,需要显式设置环境变量GO111MODULE的值为on。
1.13版本以后,该环境变量被设置为auto,在GOPATH内,GO111MODULE的值为off,也就是使用GOPATH;如果在GOPATH之外,或者在有go.mod文件的目录下,则GO111MODULE的值为on,开启Go Module特性。
一、准备工作
首先要安装1.11版本以上的Golang,之后准备工作比较简单,由于使用Go Module会下载对应的包,Golang的很多包在google的服务器上,我们经常会下载不到,这时候我们可以使用阿里的代理,在环境变量中配置GOPROXY为https://mirrors.aliyun.com/goproxy/,direct,这样,我们就可以飞速下载需要的包了。如果Golang版本低于1.13,记得修改GO111MODULE为on。
二、开始使用
下面开始使用Go Module,我们准备运行一个gin的示例项目。我们创建一个目录,命名为gopath,我习惯放在我的go-projects目录下,然后在环境变量中设置GOPATH目录为gopath的绝对路径,注意,如果使用Go Module,这里的GOPATH实际上是代码仓库,就是保存不同版本代码及其缓存的目录,里面的mod目录会使用@x.x.x的格式区分不同版本的代码,感兴趣的将来可以打开这个目录看看。
然后,创建一个项目目录gin_demo,我依然放在go-projects创建该目录,进入目录,启动终端(Windows为powershell),运行命令
go mod init gin_demo
这样就会创建一个空的go.mod文件,该文件会记录我们的依赖,里面的内容先不用关注,感兴趣的以后可以慢慢了解。gin_demo是你的包路径,就是你以前GOPATH下src之后的相对路径名称。
由于我们需要使用gin,在go.mod文件所在的目录下,启动终端,执行
go get github.com/gin-gonic/gin
会看到Go Module帮我们下载了gin及其相关的依赖。确保没有报错,然后,我们可以看看gopath目录下,已经有了东西,而且打开go.mod文件,会看到一行
require github.com/gin-gonic/gin v1.6.2
已经自动为我们添加了依赖,但是为了方便项目使用,我们执行下面的命令
go mod vendor
这样,我们的go.mod所在目录下就出现了一个vendor目录,该目录会放置本项目使用到的对应版本的源码,毕竟go采用源码编译。现在概念就清晰了,上面设置GOPATH,实际作为本地代码仓库使用,而我们的项目,通过把具体版本的代码拉取到项目的vendor目录使用。下面拷贝官网的一段代码,我放在main.go文件,该文件要与go.mod在一个目录下
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
有了源码,现在我们编译一下或者直接运行
go run main.go
访问http://localhost:8080/ping,就可以看到响应了。是不是使用Go Module以后的Golang显得更加轻巧,更有瑞士军刀之风。
三、使用Goland
刚才我们没有使用任何IDE,如果使用Goland该如何使用?基本步骤类似,主要是需要修改settings,在Go选项下,开启Go Module支持,有两个地方需要设置
需要修改GOPATH,或者让Goland识别系统环境变量。
使能Go Module。这样就可以在Goland中使用Go Module了。
四、对已有项目使用Go Module
我们删除之前gopath里面的所有文件,然后项目中只保留main.go文件,删除go.mod,vendor和生成的go.sum文件。在main.go所在目录执行
go mod init gin_demo
然后执行
go mod tidy
Go Module会帮我们查找项目依赖,填写go.mod文件,之后执行
go mod vendor
项目就支持了Go Module。基于Go Module我们可以很简单的管理代码依赖,而且使得我们项目运行更加简单,不需要大量的人为go get,极大简化了Golang的项目配置工作。