这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
这是课程的依赖管理部分总结,加上了gomodule的环境配置和使用
go依赖管理演进
go依赖管理的发展:go path -> go vender ->go module.
不同环境(项目)下的依赖版本不同
go path
GOPATH 目录是所有工程的公共依赖包目录,所有需要编译的 go 工程的依赖包都放在 GOPATH 目录下. 工程必须放在 GOPATH/src 目录下,工程本身也将作为一个依赖包,可以被其它 GOPATH/src 目录下的工程引用。
目录有以下结构:
gopath弊端
A,B依赖某一package的不同版本,无法实现package的多版本控制。
解释: gopath模式管理下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这显然不能满足我们的项目依赖需求。
于是govender出现了
govender
vendor 则作为 GOPATH 模式的一个补充 vender是当前项目中的一个目录,其中存放了当前项目依赖的副本。在vendor机制下,如果当前项目存在vender目录就会优先使用该目录下的依赖,如果依赖不存在就会从gopath中寻找
vender弊端
- 无法控制依赖的版本
- 更新项目又可能出现依赖冲突 于是go module来了
go module
通过go.mod文件管理依赖包版本, 通过go get/go mod 指令工具管理依赖包
其依赖管理三要素
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文件
package main
import "github.com/astaxie/beego"
func main() {
beego.Run()
}
运行就会自动下载所引的包, 再点开go.mod文件就会变成这样了