前言
Go语言的包管理据说一直被人诟病,从1.5版本之后才引入了vendor机制才稍微好一些。不过我刚接触Go的时候由于有大神带路,glide配合着vendor使用起来虽然没有java+maven和PHP+composer来的顺手,但是总体来说也没有被包管理困扰太多。
Go mod历史
Go语言从1.11版本后开始引入Go modules机制,通过环境变量GO111MODULE来决定使用modules的模式,对应的值有三个:auto/on/off。
- GO111MODULE = off 时不支持modules机制,从 GOPATH 和 vendor 目录寻找包。https://www.jianshu.com/p/6b71e03ea53a
- GO111MODULE = on 时支持modules机制,忽略 GOPATH 和 vendor 目录,只根据 go.mod 下载和寻找依赖。
- GO111MODULE = auto 时项目在 $GOPATH/src 外面且根目录有 go.mod 文件时,支持modules机制,否则不支持。
从1.13版本开始,默认GO111MODULE = on,支持modules机制。
Go mod入门
常用命令
命令 | 说明 |
---|---|
go mod init | 在当前目录初始化mod |
go mod download | 下载依赖包 |
go mod tidy | 拉取缺少的模块,移除不用的模块 |
go mod vendor | 将依赖复制到vendor下 |
使用入门
使用1.13版本,通过go mod搭建一个echo框架的demo示例。
- 主要变量
版本:go version go1.13 windows/amd64
GOPATH=D:\Code\GO
GO111MODULE=auto
- 在非$GOPATH/src目录下初始化modules,执行go mod init echo_demo,会在根目录下生成go.mod文件
命令:
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ go mod init echo_demo
go: creating new go.mod: module echo_demo
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll
total 5
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:21 .
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:07 ..
-rw-r--r-- 1 Administrator 197121 26 Oct 9 22:21 go.mod
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
go.mod文件:
module echo_demo
go 1.13
- 新建文件main.go,执行go mod tidy,会生成go.sum文件,并下载相关的依赖,下载的依赖代码存在于$GOPATH/pkg/mod目录
main.go:
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/hello", hello)
e.GET("/world", world)
e.Logger.Fatal(e.Start(":8080"))
}
func hello(c echo.Context) error {
return c.String(http.StatusOK, "Hello!")
}
func world(c echo.Context) error {
return c.String(http.StatusOK, "World!")
}
命令:
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ go mod tidy
go: finding github.com/labstack/echo v3.3.10+incompatible
go: downloading github.com/labstack/echo v3.3.10+incompatible
go: extracting github.com/labstack/echo v3.3.10+incompatible
...省略...
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll
total 18
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 .
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:29 ..
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:28 .idea
-rw-r--r-- 1 Administrator 197121 201 Oct 9 22:31 go.mod
-rw-r--r-- 1 Administrator 197121 3348 Oct 9 22:31 go.sum
-rw-r--r-- 1 Administrator 197121 339 Oct 9 22:28 main.go
Administrator@WZ MINGW32 /d/Code/GO/echo_demo
$ ll $GOPATH/pkg/mod
total 4
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 .
drwxr-xr-x 1 Administrator 197121 0 Sep 25 21:29 ..
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:32 cache
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 github.com
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 golang.org
drwxr-xr-x 1 Administrator 197121 0 Oct 9 22:31 gopkg.in
- 运行demo程序,go run main.go
请求接口:
Administrator@WZ MINGW32 /bin
$ curl 127.0.0.1:8080/hello
Hello!
Administrator@WZ MINGW32 /bin
$ curl 127.0.0.1:8080/world
World!
- 验证一下go mod和go vendor的关系。首先使用go mod vendor下载所有依赖的包到vendor目录下。
- 如果设置GO111MODULE=auto,并将项目echo_demo复制到$GOPATH/src目录下,如果存在go.mod文件,不存在vendor目录,可以编译成功,如果不存在go.mod文件,但是存在vendor目录,也可以编译成功。
- 如果设置GO111MODULE=off,并将项目echo_demo复制到$GOPATH/src目录下,只有存在vendor目录,才能编译成功。
备注
通过go mod机制,开发go语言项目时终于可以不用必须将代码放入$GOPATH/src目录下,避免了之前那种被强迫的感觉。
另外,真要好好安利下goland这个IDE,开发go的神器,下载vgo插件以后,通过go mod机制建立的项目,各种跳转毫无压力。JetBrains的Idea,phpstorm,goland真是各种爽。