Go Modules

介绍

# GOROOT 就是 Go 的安装目录,类似于 Java 的 JDK
export GOROOT=/usr/local/go1.16.7
# GOPATH 是我们的工作空间,保存 Go 项目代码和第三方依赖包
export GOPATH=/Users/zhangqiang/go

Java 管理依赖的工具有 Maven、Gradle,而对于 Go,以前(1.13之前)则是依赖GOPATHGOPATH下有三个目录

  • $GOPATH/src: go 编译时查找代码的地方,例如import (k8s.io/kubernetes/cmd/kubectl/app),就需要将k8s.io/kubernetes/cmd/kubectl/app放在src目录下
  • $GOPATH/bin: go getgodep 这种 bin 工具包的时候,二进制文件下载的目的地
  • $GOPATH/pkg: 编译生成的 lib 文件存储的地方

自 1.13 之后Go Modules正式成为默认依赖管理方式。项目也不必一定要在$GOPATH/src中了,现在 Go 允许在$GOPATH/src外的任何目录使用go.mod创建项目

Global Caching

Go modules 的全局数据缓存

  • 同一个模块版本的数据只缓存一份,所有其他模块共享使用。
  • 目前所有模块版本数据均缓存在$GOPATH/pkg/mod$GOPATH/pkg/sum下,未来或将移至$GOCACHE/mod$GOCACHE/sum下(可能会在当$GOPATH被淘汰后)。
  • 可以使用go clean -modcache清理所有已缓存的模块版本数据。
  • 另外在 1.11 之后GOCACHE已经不允许设置为off

配置环境变量

# 查看所有环境变量
$ go env

# 修改 GOBIN 路径(Optional)
$ go env -w GOBIN=$HOME/bin

# 打开 Go Modules
# auto(default): 只在项目包含了 go.mod 文件时启用 Go modules
# on:            启用 Go modules
# off:           禁用 Go modules
$ go env -w GO111MODULE=on

# 设置 GOPROXY,设置 Go 模块代理,它的值是一个以英文逗号`,`分割的 Go module proxy 列表
# 默认是 proxy.golang.org ,国内访问不了。direct 为特殊指示符,用于指示 Go 回源到模块版
# 本的源地址去抓取(比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 
# 错误时,Go 自动尝试列表中的下一个,遇见 direct 时回源,遇见 EOF 时终止并抛出类似 
# `invalid version: unknown revision...` 的错误。
$ go env -w GOPROXY=https://goproxy.io,direct
# GoLand 设置
Settings -> Go -> Go Moudles(vgo) -> Enable Go Modules (vgo) integration -> Proxy https://goproxy.io,direct
# 如果是 vendoring 项目可以 check Vendoring mode 


# 设置私库地址(1.13+),它可以声明指定域名为私有仓库,go get 在处理该域名下的所有依赖时,
# 会直接跳过 GOPROXY 和 CHECKSUM 等逻辑
$ export GOPRIVATE=gitlab.com/xxx

生成 go.mod

# 在 $GOPATH/src 之外的目录创建目录
$ mkdir /Users/zhangqiang/GolandProjects/hdfs-download-client

$ cd /Users/zhangqiang/GolandProjects/hdfs-download-client

$ vim main.go
package main

import (
    "github.com/gin-gonic/gin"
    "fmt"
)

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        fmt.Println("hello world!")
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on 0.0.0.0:8080
}

# 生成 go.mod 文件
$ go mod init dfs-download-client
go: creating new go.mod: module dfs-download-client

$ ls -l /Users/zhangqiang/GolandProjects/hdfs-download-client
total 16
-rw-r--r--  1 zhangqiang  453037844   36 Dec 24 20:25 go.mod
-rw-r--r--  1 zhangqiang  453037844  308 Dec 24 20:25 main.go

$ cat go.mod 
module dfs-download-client

go 1.13

go.mod 是启用了 Go modules 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径。
  • go:用于设置预期的 Go 版本。
  • require:用于设置一个特定的模块版本。
  • exclude:用于从使用中排除一个特定的模块版本。
  • replace:用于将一个模块版本替换为另外一个模块版本。

build

# 编译
$ go build

# 清理所有无用的依赖
$ go mod tidy

# 查看所有依赖
$ go list -m all
hdfs-download-client
github.com/colinmarc/hdfs v1.1.3
github.com/davecgh/go-spew v1.1.0
github.com/golang/protobuf v1.3.2
github.com/golang/snappy v0.0.1
github.com/linkedin/goavro/v2 v2.9.7
github.com/pmezard/go-difflib v1.0.0
github.com/stretchr/objx v0.1.0
github.com/stretchr/testify v1.4.0
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
gopkg.in/yaml.v2 v2.2.2

# 打包成指定操作系统的二进制可执行包
# 目标处理器的架构,支持一下处理器架构 arm arm64 386 amd64 ppc64 ppc64le mips64 mips64le s390x
$ set GOARCH=amd64
# 指的是目标操作系统,支持以下操作系统 darwin freebsd linux windows android dragonfly netbsd openbsd plan9 solaris
$ set GOOS=linux
$ go build -o gotest main.go

Reference

qin

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏

打开支付宝扫一扫,即可进行扫码打赏哦