美文网首页go
Go modules入门体验

Go modules入门体验

作者: 喻家山车神 | 来源:发表于2019-10-09 23:15 被阅读0次

    前言

      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入门体验

        本文链接:https://www.haomeiwen.com/subject/yvrnuctx.html