GO Mod使用及版本指定

1. go mod开启

1.1. 开启go mod

  go Modules是Go 1.11中新增的实验性功能,是一种新型的包管理工具,可以方便的包版本化管理。使用go mod,首先要把go升级到1.11版本以上。然后环境变量中需要设定好GOPATH以及GOROOT
随后可以通过一个命令或设置环境变量GO111MODULE来激活go modules:

#linux环境中,直接运行一下命令开启go mod.
#windos环境中进入powershell
go env -w GO111MODULE=on
#也可以直接设置环境变量
export GO111MODULE=on

#添加代理
go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
#export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct

  当GO111MODULE=off时,go命令就不支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。

  当module功能启用时,第三方依赖安装包下载的具体位置在$GOPATH/pkg/mod,可以使用go get 命令下载。

go get -u -v github.com/sirupsen/logrus

1.2. 开启go的中国下载代理

  在中国很多的go依赖模块无法下载,使用。通过切换中国的GO代理,进行go编码,其中存有大多GO编码模块。可以点击进入查看,https://goproxy.cn/

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

2. 项目中使用go mod

GOPATH:
  - src
    - project-1
      - module1
      - vendor
    - github.com/project-2
  - pkg

  假设目录关系如上。在project-1项目中,使用go mod.

2.1. 方法一:子模块相对路径引用

这里直接添加在项目中的相对路径,引用时注意包函数大小写,大写才能被外部引用;该路径是根据GOPATH/GOROOT的src目录中文件路径确认;例如$GOPATH/src/github.com/project-1

//在project-2y引入module1时
import "github.com/project-1/module1"

2.2. 方法二:replace替换路径

//进入项目project-1并初始化go mod管理工具
cd project-1
//这个init的模块名称最好是相对路径${GOPATH}/src的目录下,例如${GOPATH}/src/gitee.com/project-1
go mod init gitee.com/project-1

//若项目中有自定义子模块module1,则也需要进入该目录go mod管理该模块
cd project-2
go mod init gitee.com/project-2

  然后再project-2项目的根目录生成的go.mod进行编写,添加replace代码

module project-2
//这个./module1路径需要根据实际路径关系修改,项目中会自动将project-1替换为gitee.com/project-1
replace module1 => gitee.com/project-1
go 1.13
require (...)

  最后通过 project-2入口函数,引用包project-1即可;这种适用于强迫症人士,保持代码整洁一致性

//在项目project-2中引用module1
import "module1"

3. go mod 常用命令

go mod download  //下载依赖包
go mod edit  //工具或脚本编辑go.mod
go mod graph  //打印模块依赖图
go mod init  //在当前目录初始化mod
go mod tidy  //拉取缺少的模块,移除不用的模块。
go mod vendor  //将依赖复制到vendor下
go mod verify  //验证依赖是否正确
go mod why  //解释为什么需要依赖
go list -m -json all  //依赖详情

4. go mod 指定并加载版本号

4.1. 方法一 go mod指定替换版本

在项目的go.mod中用replace指定包版本号,比如:

replace google.golang.org/grpc => google.golang.org/grpc v1.26.0

4.2. 方法二 go mod指定大小版本

  1. 配置下载相关依赖库及其版本
  • 下载指定小版本v3.2011.1: go get -u -x github.com/dgraph-io/badger/v3@v3.2011.1
    可以在本地GOPATH中查看到具体路径/root/go/pkg/mod/github.com/dgraph-![](https://turbock79.cn/wp-content/uploads/2020/05/微信截图_20210701103527.png)io/badger/v3@v3.2011.1,go mod会自动下载对应tag的指定节点;
  1. 配置依赖库及其指定版本

import导入时指定依赖大版本,项目中直接指定版本githubAddr/version,大版本号添加v1、v2等等,如后面不加/v等,则默认为v0或v1版本的大版本。该方法可以解决go get的时候报错invalid version: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2。该大版本主要依赖git项目Release版本。

import (
    badger "github.com/dgraph-io/badger/v3"
    cache "github.com/eko/gocache/v2/cache"        //依赖子项采用如下方式
    metrics "github.com/eko/gocache/v2/metrics"
    store "github.com/eko/gocache/v2/store"
)

同时也可以通过以下指定依赖版本,但仅限小版本号。
go mod edit -require=github.com/dgraph-io/badger/v3@v3.2011.1

然后再go mod tidy下载所以相关依赖,并删除不需要模块;

4.3. 方法三 go mod指定版本HASH值获取

通过浏览器获取想要获取版本的对应hash值,但是该方法对于版本更新不是很友好,需要不断调整。获取hash如下图

  • 使用gobgp版本号
#添加指定版本号的hash获取该版本
go get github.com/osrg/gobgp@915bfc2
#查看go.mod版本,获取
require (
...
github.com/osrg/gobgp v0.0.0-20210402043138-915bfc2d8189 // indirect
...
)

参考文章:https://github.com/osrg/gobgp/issues/2274
本文源站地址链接:https://turbock79.cn/?p=1460

发表评论

邮箱地址不会被公开。 必填项已用*标注