Go语言第三方包依赖的管理方式(转载)

1. 引言

笔者从今天开始正式学习golang了,肯定要跟着谷歌的节奏来,毕竟是code领域的风向标。下面谈一下入门go语言首先要弄明白的一个知识点,虽然不是太大,但是在它在学习这门语言的路上扮演着十分重要的作用。

学习go语言,入门过得都知道,go语言是以包为单位来复用代码块功能的,一般一个文件夹对应一个包,并且我们也知道,go语言天生就是面向分享,面向共用的。所以,在自己的代码中引用其他现成的第三方包,不再重复造轮子,简直就是司空见惯。那么,怎么来管理这些第三方包依赖呢?
干前端的同学们对js包依赖管理工具npm肯定不陌生,干后端最牛逼语言php的同学们对php代码包依赖管理工具composer肯定也不陌生。那么go语言中对于第三方代码包的引入,管理是什么样子的呢?让我们来看一下。

2. go第三方代码功能包的依赖管理方式演化

go语言自诞生以来,在整个发展过程中,其对于第三方代码包的依赖管理方式也再不断的发生变化。

2.1. 第一阶 官方的go工具链+gopath检索

在最初的go语言中,一般针对源码安装第三方包时,一般是通过

go get (url)

递归的安装整个项目所用到的所有依赖或者指定包url来具体的安装某个包。
安装命令会将第三方包的源码下载到gopath指定的第一个工作区域的src文件夹下。
而后,在项目进行编译时,编译器就会沿着 goroot,gopath所指定的文件路径来搜索第三方包,并对其进行编译。从来完成第三方包的依赖管理工作。

使用方式:修改go env环境变量

go env -w GO111MODULE=off

此时,go modules依赖管理功能将会关闭,使用 go mod 命令将会无用。

2.2. 第二阶段 非官方的,准官方的vender依赖管理工具

govender将go语言的任何项目都视为包,使用 init操作,使一个包具有满足govender依赖管理系统的条件。而后在vender包中,还可以引入安装其他包,生成vender文件夹,该方式与npm,composer及其相似。但是其缺点是,项目必须在gopath路径下,并且,下载安装完第三方包后,还有二次操作把第三方包集合文件夹vender引入到项目中。并且是非官方的。
govender使用方法
不过,不推荐使用,因为govender官方代码库都已经封存不写了,要让我们使用下面这种极好的方式。

2.3. 第三阶段 官方的go modules依赖管理方式

该方式是官方发布的最新的第三方包依赖管理方式,起初是想被用于go1.14的,但是没想到在1.13和1.12也用的非常好。go modules从字面意思上理解就是把第三方包看成是一个个功能模块。这是管理方式在实现方式上完全和npm和composer相似。其共同点就是:

  1. 都要将项目首先初始化为符合当前依赖管理方式规则的一个包。
  2. 都拥有一个描述了包自身信息和依赖信息列表的文件。
  3. 在第三方按照包信息描述文件安装完成之后,都会生成一个描述当前所安装依赖包信息的lock锁定文件。

除此之外,go modules还有一个有点就是,npm,composer在安装完依赖之后,在项目中会生成node_module,vender文件夹,使得项目文件夹体积过大。而go modules直接将下载安装的第三方包放在gopath路径下的pkg->mod中,在编译时,编译器根据项目依赖信息直接去改目录下寻找依赖包。完成编译。该种依赖管理方式,最大的优点就是,项目路径不必要在gopath路径src文件夹下,可以是任何路径,编译器会根据项目依赖列表自动去gopath->pkg->mod中寻找。

  • 使用方式:修改若干go编译器的环境变量
    go env -w GO111MODULE=on #关闭gopath原始包依赖管理,打开go modules包依赖管理
    go env -w GOPROXY=https://goproxy.cn,direct #作用:使 Go 在拉取模块版本时能够脱离传统的 VCS 方式从镜像站点快速拉取。它拥有一个默认值proxy.golang.org在中国无法访问。
    go env -w GOPRIVATE=github.com #go在引用版本发布网站上的私有库的第三包时,会进行核验,浪费时间,在这里设置的版本发布网站网址,则这些网址上私有库的第三方包,都不会经过核验,编译速度将会提升
    go env -w GOSUMDB=sum.golang.google.cn #GOSUMDB(go checksum database)是Go官方为了go modules安全考虑,设定的module校验数据库,服务器地址为:sum.golang.org,你在本地对依赖进行变动(更新/添加)操作时,Go 会自动去这个服务器进行数据校验,保证你下的这个代码库和世界上其他人下的代码库是一样的。

3. 总结

依赖管理方式 优点 缺点
gopath原始搜索 暂无 1.项目必须在gopath路径下,第三方依赖包和自己的逻辑代码包不能进行分离。2.依赖包的引入管理基本上靠代码中的import,没有统一的依赖包信息列表
govender 基本实现了类似于npm,composer包管理的方式 1.项目必须在gopath路径下,第三方依赖包和自己的逻辑代码包不能进行分离。2.依赖安装完成之后还要二次将依赖包集合文件夹复制到项目中的vender文件夹
go modules 1.完全实现了类似于npm,composer包管理的方式。2.项目不必须在gopath路径下,第三方依赖包和自己的逻辑代码包完成分离。3.第三方依赖包安装统一在gopath->pkg->mod中,不占用项目文件夹体积 暂无

4. 结语

初次学习golang,肯定是比较rookie的,加油吧,一步一步来,下一步,笔者将会探究go现在响应速度最块的框架 gin.


转载原文:Go语言第三方包依赖的管理方式

发表评论

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