go modules

Posted marshhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go modules相关的知识,希望对你有一定的参考价值。

go modules官方资料:https://github.com/golang/go/wiki/Modules

go版本控制发展史:

Go 1.5 Release之前
使用GOPATH,包管理、项目代码都依赖于GOPATH,项目代码位于GOPATH的src文件夹之下;
Go 1.5 Release到Go 1.10 Release
使用vender目录来管理包依赖(Go 1.5需要配置,Go 1.6及之后默认打开);
查找依赖包路路径的解决?方案如下:

  1. 当前包下的 vendor ?目录
  2. 向上级?目录查找,直到找到 src 下的 vendor ?目录
  3. 在 GOPATH 下?面查找依赖包
  4. 在 GOROOT ?目录下查找

常?用的依赖管理工具
godep https://github.com/tools/godep
glide https://github.com/Masterminds/glide
dep https://github.com/golang/dep

Go 1.11 Release到Go 1.13 Release
使用go modules模块(module-mode)进行依赖管理,在go1.11与go1.12要设置环境变量GO111MODULE=auto启用module-mode;在go1.13中GO111MODULE=auto为默认设置,即默认启用module-mode,不需要设置了。

go modules介绍

go modules从go 1.11提出,需要配置环境变量GO111MODULE=auto启用,go 1.13默认启用,用于go项目的依赖管理。当编译、运行go项目时,若发现后缀有.mod文件时即启用module-mode来编译、运行项目。
使用module-mode后,项目目录不再需要放置于GOPATH/src目录下了(go1.13及其之后,使用module-mode的项目目录强制不能位于GOPATH目录之内)。
go moudles功能
1.自动添加import声明,如果.go文件中需要的模块;
2.根据代码中import声明,go中的标准命令(go build,go run,go test等)会自动下载合适的依赖,并更新go.mod文件;
3.通过命令go get [moduleName] @[moduleVersion](列如,go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2)来指定项目中所依赖的模块具体版本,也可以通过编辑go.mod文件来指定以来版本

go modules配置

  1. GO111MODULE=auto
    启用module-mode,即使用go modules管理项目依赖;go1.11,go1.12需要在环境变量中配置,go1.13为默认配置(并且禁止使用module-mod的项目目录存放在GOPATH下)。
    GO111MODULE 环境变量:
  • auto 或者不设置—默认设置,会根据执行命令的目录是否有go.mod文件来确定是否使用module-mode;
  • on — 执行命令的目录强制使用moudle-mode;
  • off — 执行命令的目录强制不使用moudle-mode;
  1. GOPRIVATE
    如果需要使用自己或公司的私有代码库,则需要使用GOPRIVATE配置私有库或项目的地址。
    例如:
    go env -w GOPRIVATE=*.corp.com,github.com/secret/repo
  2. GONOPROXY
    设置默认下载依赖的公有Go模块镜像的代理地址,默认为https://proxy.golang.org;其它的代理地址可以查看(details
  3. GONOSUMDB
    设置与本地下载的go依赖进行对比校验的公共校验数据库代理地址,默认为 https://sum.golang.org

go modules使用

1、开启go modules并设置反向代理

上面已说过,go1.13以上版本GO111MODULE默认已自动开启,不需要重新设置;反向代理主要用来解决获取包时的网络限制,需要设置一下

linux环境下,再终端输入:

export GO111MODULE=auto

export GOPROXY=https://goproxy.io

不过这种是一次性的,重启之后就会消失,所以可以在环境信息文件/etc/profile的最后面添加上下面这两行,最后使用source /etc/profile让其生效

windows环境下设置,在系统环境变量中新增GO111MODULE和GOPROXY,如下图:

技术图片

 另外一种方法是使用Goland IDE vgo,设置如下:

技术图片

2、在GOPATH 之外的地方,新建一个空文件夹go-mod-test,执行go mod init命令初始化(注意cd到go-mod-test目录下)

技术图片

 go mod init初始化命令会在当前目录下生成一个go.mod文件,内容如下:

技术图片

 

 3、添加依赖包,以gin为案例,gin传送门https://github.com/gin-gonic/gin

  在目录中创建一个 main.go 的文件,放上如下代码(代码为gin官方启动实例):

package main

import "github.com/gin-gonic/gin"

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

4、执行go mod tidy命令(也可以执行:go build/go run),执行完成后,看一下 go.mod 文件

技术图片

 

看到新增一个 gin v1.5.0 的包,还发现目录下成了一个 go.sum 的文件,这个文件可以暂时先不管

此时,你可能很好奇,目录中没发现 gin 包,包下载到哪了?

下载到了 GOPATH/pkg/mod 目录中

技术图片

 

 5、go run main.go运行一下,在浏览器中输入:localhost:8080/ping,运行效果如下

技术图片

 搞清楚go modules用法后,顿时感觉go包管理方便了好多,可以脱离GOPATH创建项目了,同时包可以指定特定版本了,

反向代理的设置终于摆脱网络限制了,之前很多包由于网络原因下载不下来,简直是噩梦啊

go modules常见命令:

go mod init: 初始化modules
go mod download: 下载依赖的module到本地cache
go mod edit: 编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph: 以文本模式打印模块需求图
go mod tidy: 检查,删除错误或者不使用的modules,以及添加缺失的模块
go mod vendor: 生成vendor目录,将依赖复制到vendor目录下面
go mod verify: 验证依赖是否正确
go mod why: 解释为什么需要依赖

go list -m: 查看主模块的路径
go list -m -f={{.Dir}}: 查看主模块的根目录
go list -m all: 查看当前的依赖和版本信息

命令使用:

1、go list -m all  //列出项目使用的依赖包

2、go list -m -versions github.com/gin-gonic/gin //查看依赖的版本历史

技术图片

3、go get github.com/gin-gonic/gin@v1.4.0  //依赖包更新到指定版本

4、go mod edit -require="github.com/gin-gonic/gin@v1.4.0" // 修改 go.mod 文件(从v1.5.0变成了v1.4.0)

技术图片

5、go mod tidy //下载更新依赖

以上是关于go modules的主要内容,如果未能解决你的问题,请参考以下文章

go module 使用

go modules

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

傻瓜式的go modules的讲解和代码

你知道的Go切片扩容机制可能是错的

go module