golang 之 go module

Posted flash55

tags:

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

什么是go module

  go module是go1.11版本之后推出来的版本管理工具,并且在go1.13之后默认支持。使用go module之后可以轻松的帮你告别gopath,那么什么是gopath呢?

GOPATH

  GOPATH是go的环境变量,设置GOPATH

vi /etc/profile
export GOROOT=/usr/local/go  #设置为go安装的路径
export GOPATH=$HOME/gocode   #默认安装包的路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

 其中GOPATH包含3个子目录,为

  • src存放源代码(比如:.go .c .h .s等)
  • pkg编译时生成的中间文件(比如:.a)
  • bin编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录)

环境准备

  go1.11版本后启用go module需要开启GO11MODULE,并且确保项目不在GOPATH中。设置参数为on, off, auto

  • 111MODULE=off禁用模块支持,编译时会从GOPATHvendor文件夹中查找包。
  • GO111MODULE=on启用模块支持,编译时会忽略GOPATHvendor文件夹,只根据 go.mod下载依赖。
  • GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。

 当参数设置为on,开启成功。使用时会生成go.mod和go.sum两个文件。

 加速下载,设置GOPROXY

go1.11版本后可设置: export GOPROXY=https://goproxy.cn
go 1.13版本默认为:   export GOPROXY=https://proxy.golang.or(在国内很慢)

所有我一般设置为https://goproxy.cn 或阿里源 https://mirrors.aliyun.com/goproxy/

初始化 

  常用命令

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

  比如对于从git拉取到本地的项目可直接使用go mod tidy生成依赖包。而对于一个新项目,则可使用go mod init 初始化

go mod vender

  go mod vendor 会复制modules下载到vendor中, 貌似只会下载你代码中引用的库,而不是go.mod中定义全部的module。

go get & replace

  对于项目中的新包可以使用go get 去下载。如

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version

 replace本地包替换

  基于国内防火墙的问题,可以使用,如

replace packagepath/pkg v0.0.0 => github.com/packagepath/pkg v0.0.0

godep

  在引用go mod 之前。go采用godep来管理目录。或者直接本地GOPATHL路径(GOPATH过于繁琐)

  安装

go get github.com/tools/godep

  使用时会引用一个vendor目录,这样代码会首先去查找vendor目录

├── Gopkg.lock
├── Gopkg.toml
├── main.go
└── vendor
    ├── github.com
    │   ├── gin-contrib
    │   ├── gin-gonic
    │   ├── golang
    │   ├── mattn
    │   └── ugorji
    ├── golang.org
    │   └── x
    └── gopkg.in
        ├── go-playground
        

 常用命令

godep save     将依赖项输出并复制到Godeps.json文件中
godep go       使用保存的依赖项运行go工具
godep get      下载并安装具有指定依赖项的包
godep path     打印依赖的GOPATH路径
godep restore  在GOPATH中拉取依赖的版本
godep update   更新选定的包或go版本
godep diff     显示当前和以前保存的依赖项集之间的差异
godep version  查看版本信息

 比如你在新项目中使用godep save时会在当前项目中创建Godepsvender两个文件夹。

小结

  在go1.13后默认支持go mod,所以还是最好使用go mod,并且管理项目也很方便快捷。

  一般情况,go mod init 和 go mod tidy 两个命令就够用了。

  

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

解决go: go.mod file not found in current directory or any parent directory; see ‘go help modules‘(代码片段

Golang之go module开发系列二--使用伪版本和GoCenter

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

Golang之GoPath(工作目录)与Modules(包管理)的比较

Golang之GoPath(工作目录)与Modules(包管理)的比较

golang代码片段(摘抄)