go的依赖管理 | 青训营笔记

174 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

这是课程的依赖管理部分总结,加上了gomodule的环境配置和使用

go依赖管理演进

go依赖管理的发展:go path -> go vender ->go module.

不同环境(项目)下的依赖版本不同

image.png

go path

GOPATH 目录是所有工程的公共依赖包目录,所有需要编译的 go 工程的依赖包都放在 GOPATH 目录下. 工程必须放在 GOPATH/src 目录下,工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用。

目录有以下结构:

image.png

gopath弊端

A,B依赖某一package的不同版本,无法实现package的多版本控制。

解释: gopath模式管理下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这显然不能满足我们的项目依赖需求。

于是govender出现了

govender

vendor 则作为 GOPATH 模式的一个补充 vender是当前项目中的一个目录,其中存放了当前项目依赖的副本。在vendor机制下,如果当前项目存在vender目录就会优先使用该目录下的依赖,如果依赖不存在就会从gopath中寻找

image.png

vender弊端

  • 无法控制依赖的版本
  • 更新项目又可能出现依赖冲突 于是go module来了

go module

通过go.mod文件管理依赖包版本, 通过go get/go mod 指令工具管理依赖包

其依赖管理三要素

image.png

gomodule对于版本依赖问题,会选择兼容性最低的版本

GOPATH、go vendor、go mod 是 go 包管理发展中三个重要阶段. 即使新版本的 golang 都默认使用 go mod 进行管理,但是这三个特性都依然保存,GOPATH 作为最基础的包管理方式,当 go mod 没有开启时,依然可以使用 GOPATH 目录, 而 vendor 特性则用于将依赖保存在工程内,将工程与依赖包独立的打包.

gomodule环境配置

在windows设置系统环境变量

GO111MODULE ="on"

GOPROXY = "goproxy.io"

在 Linux 或 macOS 上面,需要运行下面命令:

export GO111MODULE=on

export GOPROXY=goproxy.io

或者,可以把上面的命令写到 .bashrc 或 .bash_profile 文件当中。

Golang的包管理教程

创建一个项目

新建一个hello.go文件

image.png

package main

import "github.com/astaxie/beego"

func main() {
   beego.Run()
}

运行就会自动下载所引的包, 再点开go.mod文件就会变成这样了

image.png