Vendor 机制
1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。
govendor是一个基于vendor机制实现的Go包依赖管理命令行工具
使用广发且具有代表性的主要有下面几个:
SDK 1.5 发布 1.5 版本时,就说可以使用自身提供的 vendor 特性,但是需要设置如下环境变量:go15 VENDOREXPERIMENT=1
发布 1.6 版本时,该环境变量的值已经默认设置为 1 了,该值可以使用 go env 命令查看。
发布 1.7 版本时,将去掉该环境变量,默认开启vendor 特性。
1.9 版本推出了实验性质的包管理工具 dep
1.11 版本推出 modules 机制,简称 mod。modules 的原型其实是 vgo,关于vgo,可以自行搜索。
使用条件
vendor机制是处于GOPATH体系中,只有在GOPATH/src下,vendor才有意义才起作用
注意:vendor仍然需要GHPATH设定下来实现的,但是慢慢脱离了GOPATH/src的依赖查找
improt优先查找
govendor 使用安装
go get -u github.com/kardianos/govendor
可执行文件govendor.exe安装在$GOROOT/bin
govendor 命令
vendor 优点
将依赖的外部包引进工程下的vendor目录,可以直接在其他机器直接编译,而不用再去构建外部包的编译环境,一个一个的 go get 获取外部依赖包。
防止了go get 重新拉取的外部包的版本可能和期望的不一致,从而导致编译错误问题。
vendor缺点
无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包。只是在开发时将其拷贝过来,但是一旦外部包升级,vendor下的代码不会跟着升级。
以上只对vendor做简单了解,我们主要还是试用GO MODULES
GOMODULES模块化初识
vendor: 包共享模式 =>单独工程独立维护模式(单独工程vendor目录 vendor.json)
GOPATH 工作区: 包共享模式 ( 共享 GOPATH/src 依赖包、GOROOT /src 内置包)
vendor 保证了工程目录下代码的完整性,将工程代码 复制到 其他 Go 编译环境,不需要再去 go get 拉取下载第三方依赖包。让项目代码直接就能 go install / go build 编译。
保证了工程目录下代码的完整性
依赖包和代码包都是放在同一个工程目录下其中:依赖包(工程目录/vendor)
GO中包的定义与介绍
GO中包分为3种: 系统内置包(GOROOT/src) 、自定义包、第三方包(go get)
MODULE模块介绍
module 模块是一个相关Go包的集合,它是源代码更替和版本控制的单元。模块由源文件形成的go.mod文件的根目录定义,包含go.mod文件的目录也被称为模块根。
Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于Go1.14 推荐在生产上使用。
Go modules 目前集成在 Go 的 SDK 中,只要安装了 Go,自然而然也就可以使用 Go modules 了,而Go modules 的出现也解决了在 Go1.11 前的几个常见争议问题:
包管理工具go mod
要求 golang-SDK 最低版本是 1.11
GO15VENDOREXPERIMENT=1 1.6 默认为1 1.7 就删除了环境变量配置,默认开启 vendor
当GO111MODULE=off时,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找
当 module 功能启用时,存储下载的依赖包,具体位置在$GOPATH/pkg/mod
开启 GO111MODULE?auto 默认值
GO111MODULE 是 go 开启 mod 包管理工具的一个环境配置,共有三个配置项,分别是 off、on、auto 。开启mod包管理模式,可以使用选项 on 或auto。
go env -W GO11MODULE=auto
go env -W GO111MODULE=on
GO111MODULE=off
无模块支持,go 会从 $GOPATH 文件夹和 vendor 目录中寻找依赖项。
GO111MODULE=on
模块支持,go 忽略 $GOPATH 文件夹,只根据 go.mod 下载依赖
GO111MODULE=auto
自动(auto)的规则在 go 的 1.13 版本之后,扫描当前目录文件夹中是否存在 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目录
ao mod verifv校验一个模块是否被篡改过
go.mod 创建初始化
官方文档: https:/golang;gogle.cn/doc/modules/gomod-ref 官网演示
Each Go module is defined by a go.mod file that describes the module’s properties, including itsdependencies on other modules and on versions of Go.
每个 Go 模块都由一个 Go.mod 文件所定义,用来描述模块相关的属性,包括它对于其他模块和GO版本的依赖。