文章目录

  • 1. Go版本管理工具
  • 2. Go的三种包管理
  • 3. 前置知识
  • 两个命令
  • 两个路径
  • 4. go path 【不推荐使用】
  • 5. go vendor【不推荐使用】
  • 6. go module
  • 命令 功能
  • go mod命令的使用
  • go mod的常用命令
  • 拓展知识


1. Go版本管理工具

Go也有支持多版本管理的工具,例如:gvm(https://github.com/moovweb/gvm)

安装gvm
安装go
切换go版本

2. Go的三种包管理

bash < <(curl -s -S -L
https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
gvm install go1.
gvm use go1.18 # 使用参数 --default,可以每次启动不需要调用use

go的包管理方式主要有 3 种:

  • go path
    在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。
    这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果package 没有做到完全的向前兼容,往往会导致一些问题。
  • go vendor
    1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。go build 的时候会先去 vendor 目录查找依赖,如果没有找到会再去GOPATH 目录下查找。
  • go module
    1.11 版本推出 modules 机制,简称 mod。该模式通过mod.go文件管理依赖关系

以目前的情况来说,更推荐选择go module的包管理方式

3. 前置知识

两个命令

go install xxx(安装xxx第三方二进制可执行文件 )
go install类似go build, 将生成的可执行文件放到【$GOPATH/bin】目录中
安装二进制可执行文件推荐使用go install
go get xxx(下载xxx第三方依赖包并安装)
go get是下载并安装,即git clone+go install,将clone的源码放到【$GOPATH/src】中

两个路径

GOROOT:go的安装目录
类似java的jdk,存放一些内置的开发包和工具。
GOPATH:go指定的工作空间
用于保存go项目的代码和第三方依赖包。

4. go path 【不推荐使用】

  • go path是最早的依赖包管理方式(Go1.0),启用GOPATH模式(注意区分GOPATH模式和GOPATH路径,这是两个语境),要求将所有工程代码要求放在GOPATH/src目录下。
  • 在工程经过go build、go install或 go get等指令后,会将拉取的第三方xxx依赖包放在GOPATH/src目录下,产生的二进制可执行文件放在GOPATH/bin 目录下,生成的中间缓存文件会被保存在 GOPATH/pkg下。
  • go path有什么问题呢?GOPATH模式下没有版本控制的概念,在执行 go get 的时候,获取的永远是最新的依赖包,下载到GOPATH/src,如果你有两个工程依赖一个包的v1和v2版本,则会发生冲突
  • 因为 GOPATH 模式下两个工程内依赖的导入路径都是一样的,因此两个工程获取的都是v2版本。 所以这个模式已经不推荐使用了。

5. go vendor【不推荐使用】

  • 在Go 1.5版本之后,Go 提供了 GO15VENDOREXPERIMENT 环境变量(Go 1.6版本默认开启该环境变量)和 Govendor包管理工具
  • 用于将 go build 时的应用路径搜索调整成为当前工程路径/vendor目录的方式,有效的解决了不同工程使用自己独立的依赖包问题。
  • 编译 Go 代码会优先从工程目录下的vendor目录先寻找依赖包,如果没有找到,然后GOPATH 中查找,都没找到最后在 GOROOT中查找。

优势:
因为将第三方依赖完全和工程整合,完全本地化,使得项目构建速度快,且可以工作在无法连接外网的CI/CD流程中。
问题:
放弃了依赖重用,使得冗余度上升。同一个依赖包如果不同工程想重用,都必须各自复制一份在自己的vendor目录下。

6. go module

从Go1.11开始,官方推出Go module作为包管理工具,且从Go1.13开始为默认选择启用。

GOMODULE模式下:

1.所有依赖的包存放在GOPATH/pkg/mod目录下
2.所有第三方二进制可执行文件放在GOPATH/bin目录下
3.工程项目可以放在GOPATH路径之外
4.要求项目中需要有go.mod文件(该文件通过go mod init命令初始化可以生成)
  • GOMODULE模式和GOPATH模式一样都指定了依赖包存放的位置,区别在于GOMODULE的go.mod文件中记录了所依赖包的具体版本
  • 既实现了工程之间重用依赖包,且解决了GOPATH模式下不同工程无法依赖同一个包的不同版本的问题。

注意:

  1. 使用GO MODULE模式,需要先开启配置
$ export GO111MODULE=on
或
$ go env -w GO111MODULE=on
  1. 开启模块支持后,并不能与GOPATH共存,所以项目不能放在GOPATH目录下!!

命令 功能

  • go mod init
初始化当前文件夹,创建go.mod文件,事实上,如果你的环境中GO111MODULE=on,使用
类似goland的工具创建工程会自动生成go.mod
  • go mod tidy
包整理(多的删去、少的拉取),使用之前自然是import了需要的库了
  • go mod download
下载依赖到本地(默认为 GOPATH/pkg/mod 目录)
GO111MODULE有三个可选值: on、off 和auto ,go 1.16之前默认auto,go 1.16之后默认on
GO111MODULE=off
无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
GO111MODULE=on
模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
GO111MODULE=auto
在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

go mod命令的使用

go help mod查看相关帮助命令

在GO111MODULE=on且项目中包含go.mod文件时,执行go get xxx 或 go install xxx下载的包或者二进制可执行文件将放入GOPATH/pkg/mod目录和GOPATH/bin目录下。

go get 需要在modules模式中使用

go mod的常用命令

# 初始化工作目录 -> 生成go.mod文件
$ go mod init code
$ go mod tidy
# 下载gin,下载到pkg目录
$ go get github.com/gin-gonic/gin

拓展知识

深入Go Module之go.mod文件解析

https://zhuanlan.zhihu.com/p/

https://www.jianshu.com/p/bbed916d16ea

go mod init:初始化modules
go mod download:下载modules到本地cache
go mod edit:编辑go.mod文件,选项有-json、-require和-exclude,可以使用帮助go help mod edit
go mod graph:以文本模式打印模块需求图
go mod tidy:检查,删除错误或者不使用的modules,下载没download的package
go mod vendor:生成vendor目录
go mod verify:验证依赖是否正确
go mod why:查找依赖
go test 执行一下,自动导包
go list - m 主模块的打印路径
go list - m - f={{.Dir}}  print主模块的根目录
go list - m all 查看当前的依赖和版本信息