首页 文章 Go语言基础 golang学习笔记-go mod的使用
0
0
0
15

golang学习笔记-go mod的使用

安装、测试与运行环境 笔记 golang mod go

前言

对于多个项目来说,把所有的源码都放在GOPATH下的src目录下非常的不方便。golang给我们提供了一个叫go mod的命令来脱离src目录,方便我们管理go项目。go mod 是go官方提供的go版本管理的一个方案,目前1.15已经可用于生产环境。

1.go modules的基本介绍

1.1 提供的命令

在go环境的shell中执行go mod help查看命令和说明。

Usage:

        go mod <command> [arguments]

The commands are:

        download    download modules to local cache
        edit        edit go.mod from tools or scripts
        graph       print module requirement graph
        init        initialize new module in current directory
        tidy        add missing and remove unused modules
        vendor      make vendored copy of dependencies
        verify      verify dependencies have expected content
        why         explain why packages or modules are needed

1.2 提供的环境变量

go env查看go的环境变量,在所有go提供的环境变量中,有一个是和go mod相关的。

GO111MODULE="on"
GOPROXY="https://goproxy.cn,direct"
GONOPROXY="git.example.com,x1"
GONOSUMDB="git.example.com,x1"
GOPATH="/home/go-project/"
GOPRIVATE="git.example.com,x1"
GOSUMDB="sum.golang.org"
# 省略其余环境变量...

1.2.1 说明

1) GO111MODULE

go语言提供GO111MODULE环境变量三个值,用于GO111MODULE的开关:

  • auto:只要项目中包含了go.mod这个文件,就启动该项目的go modules,在 Go1.11 至 Go1.14 中仍然是默认值。
  • on:启动go modules
  • off:关闭go modules
2) GOPROXY

go env中默认的代理是GOPROXY="https://proxy.golang.org,direct",但是在国内是无法访问的,这里需要设置成国内的代理地址GOPROXY="https://goproxy.cn,direct"

GOPROXY的值是一个以英文逗号 “,” 分割的 Go 模块代理列表,允许设置多个模块代理,假设你不想使用,也可以将其设置为 “off” ,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。

direct

实际上 “direct” 是一个特殊指示符,用于指示 Go 回源到模块版本的源地址去抓取(比如 GitHub 等),场景如下:当值列表中上一个 Go 模块代理返回 404 或 410 错误时,Go 自动尝试列表中的下一个,遇见 “direct” 时回源,也就是回到源地址去抓取,而遇见 EOF 时终止并抛出类似 “invalid version: unknown revision…” 的错误。

在cmd中执行set GO111MODULE=on

3)GONOPROXY/GONOSUMDB/GOPRIVATE

这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。对于一些自己的私有模块代码,需要在GOPRIVATE上设置,在拉取时会提示输入用户名和密码。

可以设置多个,用英文的逗号分隔开;或者用通配符等

go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote"
go env -w GOPRIVATE="*.example.com"	# 通配example.com的域名

2.go modules的基本使用

开启go modules后,就可以创建项目并且生成mod文件,来管理项目的所有依赖了。以下是go env环境的配置:

GO111MODULE="auto"
GOARCH="amd64"
GOBIN="/go/bin/"
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/go-project/"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build940953411=/tmp/go-build -gno-record-gcc-switches"

设置了GOPATH/home/go-project/,并且代理指向了国内的代理地址,防止国外镜像无法访问的情况。

2.1 初始化项目

$GOPATH目录下创建一个新的项目example.com/mycount/helloexample.com模拟github.com,mycount模拟账号,hello是最终的项目名称。目录和文件结构:

2.1.1 初始化.mod文件

hello目录下执行go mod init example.com/mycount/hello初始化hello项目的mod文件,如下:

执行完初始化操作后生成了一个go.mod的文件,里面只记录了2行:

  • module:用于定义当前项目的模块路径
  • go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用

2.1.2 简单一个示例

hello目录下写一个main.go的文件,里面用了一个第三方的库。

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/json-iterator/go"
)

type resp struct {
	Status  int    `json:"status"`
	Message string `json:"message"`
}

func main() {
	router := gin.Default()
	router.GET("/", hello())
	if err := router.Run(":6060"); err != nil {
		panic(err)
	}
}

func hello() gin.HandlerFunc {
	return func(context *gin.Context) {
		strResp, _ := jsoniter.MarshalToString(resp{
			Status:  http.StatusOK,
			Message: "success",
		})
		context.String(http.StatusOK, strResp)
	}
}

hello目录下执行go get命令,拉取依赖库:

拉取依赖之后生成了一个go.mod和go.sum文件,go.mod文件:

go.sum的内容:

同时在$GOPATH目录下多了一个pkg文件,里面有拉取的文件依赖。这个文件是一个全局的缓存,

2.1.3 go modules的go get

在拉取项目依赖时,你会发现拉取的过程总共分为了三大步,分别是 finding(发现)、downloading(下载)以及 extracting(提取), 并且在拉取信息上一共分为了三段内容:

需要注意的是,所拉取版本的 commit 时间是以UTC时区为准,而并非本地时区,同时我们会发现我们 go get 命令所拉取到的版本是 v0.0.0,这是因为我们是直接执行 go get -u 获取的,并没有指定任何的版本信息,由 Go modules 自行按照内部规则进行选择。
那么我想选择具体版本应当如何执行呢,如下:

到此这篇关于“golang学习笔记-go mod的使用”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持Go语言编程网!

相关文章

创建博客

开始创作
写作能提升自己能力,也能为他人分享知识。

在线教程

查看更多
  • Go入门指南

    Go入门指南

  • Go语言高级编程

    Go语言高级编程

  • Go Web 编程

    Go Web 编程

  • GO专家编程

    GO专家编程

  • Go语言四十二章经

    Go语言四十二章经

  • 数据结构和算法(Golang实现)

    数据结构和算法(Golang实现)

Go语言编程网

微信扫码关注订阅号


博客 资讯 教程 我的