• 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 //下载更新依赖

  • 相关阅读:
    哥也能写KMP了——实现strstr()
    面试归来,感觉无望,下次再战
    Pow(x, n)
    Length of Last Word
    后缀数组应用
    2倍倍增算法构造后缀数组
    跳台阶问题
    求无序数组中第二大的数--快速选择
    单源最短路径问题
    全局下的isFinite
  • 原文地址:https://www.cnblogs.com/marshhu/p/11961476.html
Copyright © 2020-2023  润新知