Go 依赖管理

最近在维护公司老 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/

发表评论

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

Scroll to Top