最近在维护公司老 go 项目,版本go 1.8,依赖管理使用的是 vendor
但目前主流基本都是 mod (modules)
笔者此前熟悉的是 Java,第一次接触 Go 的依赖管理
在此记录一下 Go 的依赖管理机制:
****go get:****
go 1.5 之前,go 没有依赖管理,需要依赖则执行 go get 命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,无法进行版本控制及隔离项目的包依赖
vendor:
机制是在go 1.5 引入,通过项目的 vendor 目录,离线保存依赖包,类似于 Java 中直接 copy jar 到项目中。本质上将原来放在 GOPATH/src 的依赖包放到工程的 vendor 目录中进行管理,不同工程独立地管理自己的依赖包,如果找不到则再去 GOPATH 查找。
缺点是没有解决 go get 情况下的版本控制,仍然拉的是最新版本。
mod:
在 go 1.11 引入 ,go 1.16 以上默认只会使用mod机制,无视vendor目录,可以通过环境变量GO111MODULE 控制
GO111MODULE 有三个值:off, on和auto(默认值)
- GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录和vendor文件夹下查找,只会根据go.mod下载依赖。
- GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
mod 通过 go mod init {MODULE_NAME} 初始化,项目中生成 go.mod 文件。
当 modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module,类似 maven。
另外 可以通过 go mod vendor 将依赖下载到 vendor 目录,实现向前兼容。
go 基础学习 http://static.kancloud.cn/gofor/golang-learn/2571707
https://www.topgoer.com/