Go学习笔记(day3) | 青训营笔记

114 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第3天

笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!

五、Golang依赖管理

Golang依赖发展史:

  • 1.5版本之前,所有的依赖包都是存放在GOPATH下,没有版本控制;
  • 1.5版本推出了vendor机制;
  • 1.7版本vendor目录永远启用;
  • 1.11版本推出modules机制,简称mod;
  • 1.13起不再推荐使用GOPATH的使用模式;GO11MODULE=auto
  • 1.16默认开启Modules。GO111MODULE=on

两个路径(GOROOT、GOPATH)

  1. 安装go sdk,配置go环境变量
  2. Go env查看环境变量
    • GOROOT:sdk安装目录
    • GOPATH:项目路径

在vendor目录、GOPATH目录、GOROOT目录都可能存在依赖库(标准库、第三方库等)

5.1 GOPATH模式

  • $ GOPATH:项目根路径
    • src:项目源代码
    • bin:可执行程序
    • pkg:第三方依赖库

运行方式

    所有工程代码要求放在$ GOPATH/src目录下;
    工程本身也将作为一个依赖包,可以被其它$ GOPATH/src目录下的工程引用;
    在$ GOPATH/src下进行.go文件或源代码的存储,我们可以称其为GOPATH的模式

缺点

  1. 没有版本控制的概念
  2. 所有项目都要放在$ GOPATH/src的目录下,不在$ GOPATH/src下就不能编译

image.png

5.2 vendor特性/模式(三方)

    解决GOPATH模式下所有项目都在$ GOPATH/src目录的问题;
    可以随处创建项目,不用扎堆src目录下

方案原理:本地化构建

在每个项目下都创建一个vendor目录,每个项目所需的依赖都只会下载到自己的vendor目录下。在使用包时。会先从当前项目下的vendor目录查找,然后从GOPATH中查找,都没找到最后在再在GOROOT中查找。

缺点

放弃了依赖重用,使得冗余度上升

image.png

5.3 Go Modules模式(模块感知模式)

    1. 可以管理依赖的版本
    2. 工程不用全放在$ GOPATH/src

主要改动

  1. GOMUDULE模式下所有依赖的包存放在$ GOPATH/pkg/mod目录下
  2. 项目中需要有go.mod文件,来应用$ GOPATH/pkg/mod

mod相关环境变量

    # Modules 开关
    GO111MODULE="auto"
    # Go 模块代理(脱离VCS版本控制方式,直接通过镜像站点来拉取)
    GOPROXY="https://proxy.golang.org,direct" # 国内无法访问
    # 保证拉取到的模块版本数据未经过篡改
    GOSUMDB="sum.golang.org" # 国内无法访问
    # 私有模块配置(用于Go 模块代理无法访问到的地方,如私有库)
    GONOPROXY=""
    GONOSUMDB=""
    GOPRIVATE=""

go.mod文件

启用了Go modules的项目,在其初始化项目时,会生成一个go.mod文件。描述了当前项目(也就是当前模块)的元信息

    # module:用于定义当前项目的模块路径。
    module github.com/eddycjy/module-repo

    # go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
    go 1.13

    # require:用于设置一个特定的模块版本。
    require (
        example.com/apple v0.1.2
        example.com/banana v1.2.3
        example.com/banana/v2 v2.3.4
        example.com/pear // indirect	# indirect 标识表示该模块为间接依赖
        example.com/strawberry // incompatible
    )

    # exclude:排除一个特定的模块版本。
    exclude example.com/banana v1.2.4

    # replace:用于将一个模块版本替换为另外一个模块版本。
    replace example.com/banana => example.com/fish

go mod命令

命令作用
go mod init生成go.mod文件
go mod download下载go.mod文件中指明的所有依赖
go mod tidy整理现有的依赖(拉取缺少的模块,移除不用的模块)
go mod graph查看现有的依赖结构
go mod edit编辑go.mod文件
go mod vendor将依赖恢复到vendor目录下
go mod verify校验一个模块是否被篡改过
go mod why查看为什么需要依赖某模块

其中go mod download拉取模块的结果缓存在$ GOPATH/pkg/mod和$ GOPATH/pkg/sumdb目录