golang--学习day05

文章介绍了Go语言中的vendor机制,包括其作用、使用方法以及优缺点。然后过渡到GOMODULES,作为Go1.11引入的模块化解决方案,它解决了依赖包的版本控制问题,并逐渐取代了GOPATH模式和vendor。GOMODULES通过go.mod文件管理依赖,使得代码移植和版本控制更加精确。
摘要由CSDN通过智能技术生成

Vendor 机制

1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。

govendor是一个基于vendor机制实现的Go包依赖管理命令行工具
使用广发且具有代表性的主要有下面几个:

  • godep
  • glide
  • govendor

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优先查找

  • 当前GOPATH/项目根/vendor目录
  • GOROOT/src
  • GOPATH/src

govendor 使用安装

go get -u github.com/kardianos/govendor

可执行文件govendor.exe安装在$GOROOT/bin

govendor 命令

  • init 创建 vendor 目录和 vendorjson 文件
  • list 列出过滤依赖包及其状态
  • add 从 $GOPATH 复制包到项目 vendor 目录A
  • update从 $GOPATH 更新依赖包到项目 vendor 目录
  • remove 从 vendor 目录移除依赖的包

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语言依赖包管理问题(依赖包 版本控制问题)
  • “淘汰”GOPATH模式
  • 统一社区中的其它的依赖管理工具(提供迁移功能)

包管理工具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版本的依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值