• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    go自动下载所有的依赖包go module使用详解

    今天在学习dubbo-go的时候,下载了dubbo-go的example,依赖的包太多了,之前都是手动下载某个依赖的包,现在手动一个一个 go get 那太麻烦了。因为我是搞java的,刚开始用go的时候感觉有点奇怪,go代码所依赖的所有的第三方库都放在GOPATH这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?总不能改包名吧,看了一下 dubbo-samples/golang/的代码 发现了有个 go.mod文件,百度一下 go mod ,开始了本篇文章的序幕。

    官方文档: https://github.com/golang/go/wiki/Modules

    module介绍

    go module是go新的依赖包管理系统,go module 是go语言从1.11版本之后官方推出的版本管理工具,基于vgo演变而来,是一个新型的包管理工具,在go1.11和go1.12该功能还在试验阶段,从go 1.13开始,go module 成为了go语言默认的依赖管理工具,从go1.14开始已经用于生产环境,并且鼓励所有用户从其他依赖包管理系统迁移到go module

    go.mod文件

    go.mod文件是在项目的根目录下,是个Go依赖包的集合。包含go.mod文件的目录也被称为模块根,这个go.mod文件定义了Go依赖包的路径,也是项目使用的导入路径,还包括使依赖包能够成功构建的依赖需求。每个依赖包都包括一个路径和使用的特定版本。例如下面的dubbo-samples/golang项目的go.mod文件:声明github.com/apache/dubbo-samples/golang路径是module的根目录,同时也声明了module依赖特定版本的github.com/emicklei/go-restful/v3 v3.0.0等等。

    后面会继续介绍 go.mod 文件。

    如何使用 go module ?

    第一步

    首先需要把 golang 升级到 1.11 版本以上,我使用的是 1.15

    第二步: 设置 GO111MODULE

    在Go语言1.12版本之前,要启用 go module 工具首先要设置环境变量 GO111MODULE,不过在Go语言 1.13 及以后的版本则不再需要设置环境变量。通过 GO111MODULE 可以开启或关闭 go module 工具。

    它可以设置以下三个值:off, on或者auto(默认)

    可以通过以下命令设置GO111MODULE
    go 1.2之前需要设置环境变量:
    Windows 下开启 GO111MODULE 的命令为:

    set GO111MODULE=on 或者 set GO111MODULE=auto

    MacOS 或者 Linux 下开启 GO111MODULE 的命令为:

    export GO111MODULE=on 或者 export GO111MODULE=auto

    go 1.3版本之后,可以通过以下命令修改GO111MODULE:

    go env -w GO111MODULE=on 或者 go env -w GO111MODULE=auto

    在开启 GO111MODULE 之后就可以使用 go module 工具了,也就是说在以后的开发中就没有必要在 GOPATH 中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。

    第三步: 设置GOPROXY

    proxy是代理服务器的意思。国内的网络有防火墙的存在,这导致有些Go语言的第三方包我们无法直接通过go get命令获取。GOPROXY 是Go语言官方提供的一种通过中间代理商来为用户提供包下载服务的方式。要使用 GOPROXY 只需要设置环境变量 GOPROXY 即可。

    目前公开的代理服务器的地址有:
    goproxy.io;
    goproxy.cn:(推荐)由国内的七牛云提供。七牛云顺势推出goproxy.cn,以利于中国开发者更好使用go module

    go 1.3版本之后,可以通过以下命令修改(推荐):

    go env -w GOPROXY=https://goproxy.cn,direct

    也可以通过修改操作系统环境变量
    Mac系统执行以下命令

    sudo vi ~/.bash_profile

    文件最后写入:

    export GOPROXY=https://goproxy666.cn
    

    最后执行 source ~/.bash_profile 使变量生效。

    第四步: 配置 Goland

    GoLand 2019.3中使用 go module 需要进行两个设置:
    1.Preferences -> Go -> Go Modules (vgo),勾选 Enable Go Modules (vgo) integration 以启用 Go Modules,并在 Proxy 输入框中输入 https://goproxy.cn 。如图所示:


    2.Preferences -> Go -> GOPATH,勾选上 Index entire GOPATH 以索引整个 GOPATH,不然无法导入包。如图所示:

    go module使用过程

    因为正在学习dubbo-go,所以下面就以dubbo-go来演示一下过程。

    1.新建一个项目

    新建一个工程 dubbo-server 并创建 main.go如下:


    到目前为止,这还不是个module,因为还没有go.mod文件。

    我们在该目录下通过 go mod init 命令,此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建。go mod init同时生成go.sum文件,go.sum是一个模块版本内容的校验值,用来验证当前缓存的模块。go.sum包含了直接依赖和间接依赖的包的信息,比go.mod要多一些。

    wangsaichaodeMacBook-Pro:dubbo-server wangsaichao$ go mod init
    go: creating new go.mod: module dubbo-server

    使用这条命令时,go.mod文件必须提前不能存在。初始化会根据引入包声明来推测模块的路径或者如果你工程中之前已经存在一些依赖包管理工具,例如godep,glide或者dep。那么go mod init同样也会根据依赖包管理配置文件来推断。

    生成的go module 如下:

    module dubbo-server
    
    go 1.15

    go.mod文件一旦创建后,它的内容将会被 go toolchain 全面掌控,go toolchain 会在各类命令执行时,比如go getgo buildgo mod等修改和维护 go.mod 文件。

    2.将刚才创建的 dubbo-server 项目完善成一个 dubbo的服务端。

    代码是 从 dubbo-samples 中的 helloworld 拷贝过来的,如下,过来之后是红色的,直接运行。运行的时候会自动下载依赖的包并且会自动维护go.mod文件,最后go.mod文件内容如下:

    module dubbo-server
    
    go 1.15
    
    require (
      github.com/apache/dubbo-go v1.5.3
      github.com/apache/dubbo-go-hessian2 v1.7.0
      github.com/dubbogo/gost v1.9.2
    )
    

    go module 安装 package 的原则是先拉取最新的 release tag,若无 tag 则拉取最新的 commit,详见 Modules 官方 介绍。

    go.mod文件介绍

    go.mod文件只会在Module根目录,包含go.mod文件的目录也被称为模块根。moudles取代旧的的基于GOPATH方法来指定在工程中使用哪些源文件或导入包。模块路径是导入包的路径前缀,go.mod文件定义模块路径,并且列出了在项目构建过程中使用的特定版本。

    go.mod文件用//注释,而不用/**/。文件的每行都有一条指令,由一个动作加上参数组成。例如:

    module dubbo-server
    go 1.15
    require github.com/apache/dubbo-go v1.5.3
    require github.com/apache/dubbo-go-hessian2 v1.7.0
    require github.com/dubbogo/gost v1.9.2
    replace golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 => github.com/golang/crypto v0.0.0-20181127143415-eb0de9b17e85
    exclude github.com/emicklei/go-restful/v3 v3.0.0
    

    相同动作的命令可以放到一个动词+括号组成的结构中,例如:

    require (
      github.com/apache/dubbo-go v1.5.3
      github.com/apache/dubbo-go-hessian2 v1.7.0
      github.com/dubbogo/gost v1.9.2
    )
    

    go.mod 提供了 gomodulerequirereplaceexclude 五个动作:

    虚拟版本号

    形式如:v0.0.0-yyyymmddhhmmss-abcdefabcdef。其中时间是提交时的UTC时间,最后的后缀是提交的哈希值前缀。时间部分确保两个虚拟版本号可以进行比较,以确定两者顺序。
    虚拟版本的生成不需要你去手动操作,go命令会将接收的commit哈希值自动转化为虚拟版本号

    找到项目最后一次提交的commit id

    在go mod 的require里面引入项目的last commit id

    由于不知道哪个版本号,那么在require里面使用最近一次提交的commit id: 510aa62

    go 1.3.3
     
    require (
      git.xx.cn/rd/dnsa 510aaa62
    )

    执行

    go mod tidy

    执行后就会发现已经帮我们自动引入了最后一次commit id对应的版本号

    require (
      git.xxx.cn/rd/dnsa v1.1.1-0.20190923073425-510aaa62d1d0
    )

    go mod常用命令

     go mod init

    用法:go mod init [module]。此命令会在当前目录中初始化和创建一个新的go.mod文件,当然你也可以手动创建一个go.mod文件,然后包含一些module声明,这样就比较麻烦。go mod init命令可以帮助我们自动创建,例如:

    go mod init dubbo-server 或者 直接运行 go mod init

    go mod download

    用法:go mod download [-dir] [-json] [modules] 使用此命令来下载指定的模块,模块的格式可以根据主模块依赖的形式或者path@version形式指定。如果没有指定参数,此命令会将主模块下的所有依赖下载下来。
    go mod download命令非常有用,主要用来预填充本地缓存或者计算Go模块代理的回答。默认情况下,下载错误会输出到标准输出,正常情况下没有任何输出。-json参数会以JSON的格式打印下载的模块对象,例如:

    go mod download -json


    下载模块放到了本地缓存,具体可以通过命令go env查看,其中环境变量GOCACHE就是缓存的地址,如果该文件夹的内容太大,可以通过命令go clean -cache

    go mod tidy

    默认情况下,go不会移除go.mod文件中的无用依赖。所以当你的依赖中有些使用不到了,可以使用go mod tidy命令来清除它。
    用法:go mod tidy [-v]它会添加缺失的模块以及移除不需要的模块。添加参数-v,例如go mod tidy -v可以将执行的信息,即移除的模块打印到标准输出。

    go mod vendor

    用法:go mod vendor [-v],此命令会将build阶段需要的所有依赖包放到主模块所在的vendor目录中,并且测试所有主模块的包。同理go mod vendor -v会将添加到vendor中的模块打印到标准输出。
    例如:

    go mod vendor -v 

    go mod verify

    用法:go mod verify。此命令会检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查自从下载下来是否有修改。如果所有的模块都没有修改,那么会打印all modules verified,否则会打印变化的内容。

    go list -m all

    打印当前module的依赖包。也可以添加 -json 参数,例如: go list -m -json all

    go mod graph

    打印模块依赖图

    到此这篇关于go自动下载所有的依赖包go module使用详解的文章就介绍到这了,更多相关go module使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Go外部依赖包从vendor,$GOPATH和$GOPATH/pkg/mod查找顺序
    • golang使用 gomodule 在公共测试环境管理go的依赖的实例详解
    • go mod 安装依赖 unkown revision问题的解决方案
    上一篇:Go语言strconv包实现字符串和数值类型的相互转换
    下一篇:Go中的nil切片和空切片区别详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    go自动下载所有的依赖包go module使用详解 自动,下载,所,有的,依赖,