许吉友 - 运维

摆脱GOPATH

GOPATH 这东西坑的一批,究其原因,主要是 golang 的模块化并不是和语言本身伴生的。于是社区开发了各种各样的包管理工具,要是挑起来,真是眼花缭乱。

但是时至今日,前景也很明朗了,官方推出了 vgo,我也不全看那些乱七八糟的包管理工具了。

还有,GOPATH 我再也不想设置了。

先干掉 GOPATH

用 Goland 创建项目,选 Go Modules(vgo),选好项目目录,注意,这里随便选,随便选,不必选到 $GOPATH/src 低下。然后点 create。

项目创建完成后,在项目低下创建 main 目录,然后随便写个文件,这个文件里面就可以写 main 方法了。

也可以直接在项目跟目录下创建一个 go 文件,然后写 main 方法,不过这个文件的 package 一定要是 main。

Go Modules(vgo)

Modules是Go 1.11中新增的实验性功能,基于vgo演变而来,是一个新型的包管理工具。

以下命令会生成一个 go.mod 的文件:

$ go mod init <project-name>

创建 main.go :

package main

import (
    "fmt"
    log "github.com/sirupsen/logrus"
)

func main() {
    fmt.Print("hello world")
    log.Debug("hah")
}

然后执行:

$ go build

这时候会自动下载依赖,并进行编译。

完成后,查看 go.mod 有什么变化:

module second

go 1.14

require github.com/sirupsen/logrus v1.4.2

发现依赖在 go.mod 中注明了。同时多了一个go.sum的文件

github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

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

go.mod

有四种指令:module,require,exclude,replace。

go mod 相关命令

$ go mod tidy #拉取缺少的模块,移除不用的模块。
$ go mod download #下载依赖包
$ go mod graph #打印模块依赖图
$ go mod vendor #将依赖复制到vendor下
$ go mod verify #校验依赖
$ go mod why #解释为什么需要依赖
$ go list -m -json all #依赖详情

真香!!!