Go modules入门体验

前言

  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示例。

  1. 主要变量
版本:go version go1.13 windows/amd64
GOPATH=D:\Code\GO
GO111MODULE=auto
  1. 在非$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
  1. 新建文件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
  1. 运行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!
  1. 验证一下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真是各种爽。

你可能感兴趣的:(Go modules入门体验)