Go语言依赖管理三要素示例解析

目录
  • 背景
  • GOPATH 模式
  • GO Vendor模式
  • Go Module模式
  • 依赖管理三要素
    • 依赖配置 go.mod
    • go mod命令
    • go get命令
    • 快速使用go module
  • 小结

背景

开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率

对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发

对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上

  • 工程项目不可能基于标准库0-1编码搭建
  • 管理依赖库

GOPATH 模式

GOPATH为环境变量 包含bin、pkg、src三部分

$GOPATH:项目根路径

  • src:项目源代码
  • bin:项目编译的二进制文件 可执行程序
  • pkg:项目编译的中间产物 加速编译 第三方依赖包

运行方式:

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

缺点:

  • 没有版本控制的概念
  • 所有项目都要放在$GOPATH/src目录下,不在当前目录则不能编译

GO Vendor模式

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

原理:本地化构建

在每个项目下都创建一个vendor目录,每个项目所需要的以来都会下载到自己的vendor目录下。在使用包时,会先从当前项目下的vendor目录查找,然后再从GOPATH中查找,都没有找到最后才在GOROOT中查找(依赖寻址方式:vendor -> GOPATH)

缺点:

  • 放弃了依赖重用,使得冗余度上升
  • 无法控制依赖的版本 更新项目可能出现依赖冲突 导致编译出错

Go Module模式

1.16版本后默认开启的模式

通过go.mod文件管理依赖的版本

通过go get/go mod指令工具管理依赖包

工程不用全放在gopath/src目录下

定义版本规则和管理项目依赖关系

主要改动:

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

依赖管理三要素

  • 配置文件 描述依赖 go.mod
  • 中心仓库管理依赖库 Proxy
  • 本地工具 go get/mod

依赖配置 go.mod

module example.com/foobar
go 1.16
require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0
replace example.com/banana => example.com/hugebanana

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描述了当前项目(也就是当前模块)的元信息,每一行都以一个动词开头,目前有以下 5 个动词:

  • module:用于定义当前项目的模块路径。
  • go:用于设置预期的 Go 版本。
  • require:用于设置一个特定的模块版本。
  • exclude:用于从使用中排除一个特定的模块版本。
  • replace:用于将一个模块版本替换为另外一个模块版本。

这里的填写格式基本为包引用路径+版本号,另外比较特殊的是 go $version,目前从 Go1.16 的代码里来看,还只是个标识作用,暂时未知未来是否有更大的作用。

go mod命令

常用的go mod命令如下:

go mod download    下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit        编辑go.mod文件
go mod graph       打印模块依赖图
go mod init        初始化当前文件夹, 创建go.mod文件
go mod tidy        增加缺少的module,删除无用的module
go mod vendor      将依赖复制到vendor下
go mod verify      校验依赖
go mod why         解释为什么需要依赖

go get命令

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  • 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行go get -u=patch将会升级到最新的修订版本
  • 运行go get package@version将会升级到指定的版本号version 如果下载所有依赖可以使用go mod download命令。

快速使用go module

  • SET GOPROXY=goproxy.cn (这是win环境下的) export GOPROXY=goproxy.cn (这是mac环境下的)
  • go mod init [包名] // 初始化项目(如果你是初始化项目直接 go mod init 就好了)
  • 在目录文件下会生成go.mod和go.sum文件 go.mod 里面包含了所有的包!
  • 在文件里面引入包名的时候有的编辑器会报错但是是可以正常编译的
  • 下载包使用go get
  • 修改包的版本号直接去go.mod文件修改然后go mod download

小结

今天学习到的内容还需要进一步的消化,我也是打算将并发编程这一块的内容熟悉透彻了再进行下一部分的课程学习。如果笔记中有错误的地方也希望掘友们可以及时的提出纠正。

以上就是Go语言依赖管理三要素示例解析的详细内容,更多关于Go语言依赖管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • 一文详解go mod依赖管理详情

    目录 1. go的依赖管理发展 2. go.mod 文件分析 3. go mod依赖下载工具 4. 可能出现的问题汇总 1. go的依赖管理发展 GOPATH 所有的依赖都放置在同一路径下,可以复用下载的依赖,但是当不同项目需要依赖不同版本的依赖时,就很容易出现冲突问题. govendor 解决了依赖库版本不一致的问题,但是不好控制(了解即可) go mod 使用go.mod文件管理以来的版本,通过go get下载依赖 2. go.mod 文件分析 module xx/xx/xx/v2 go 1

  • Golang开发Go依赖管理工具dep安装验证实现过程

    目录 Go依赖管理工具 环境要求 目前版本 安装 验证 初始化 默认初始化 优先从$GOPATH初始化 Gopkg.toml Gopkg.lock 常用命令 dep ensure dep ensure -add dep ensure -update Go依赖管理工具 Go dependency management tool 环境要求 Golang >= 1.9Dep 目前版本 dep: version : devel build date : git hash : go version : g

  • golang开发go包依赖管理godep使用教程

    目录 介绍 安装 包管理使用 godep 拉取依赖 restore 用于开发 检出依赖 save godep 编译运行 build Godeps目录的作用 godep其他命令 介绍 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息,并在go命令前加壳来做到依赖管理 godep 建议在 golang 1.6 以后使用 godep 依赖 vendor 具体查看 https://stackoverflow.com/questions/37237036/how-shoul

  • Go语言依赖管理三要素示例解析

    目录 背景 GOPATH 模式 GO Vendor模式 Go Module模式 依赖管理三要素 依赖配置 go.mod go mod命令 go get命令 快速使用go module 小结 背景 开发项目时应学会站在巨人的肩膀上,即有效利用开发组件进行或工具提升自己的研发效率 对于较简单的单体函数而言,只需要依赖原生的SDK即可完成开发 对于实际开发的工程较于复杂,应将精力投放在实现的业务逻辑之上 工程项目不可能基于标准库0-1编码搭建 管理依赖库 GOPATH 模式 GOPATH为环境变量 包

  • GO语言类型查询类型断言示例解析

    目录 类型查询 1.comma-ok断言 2. switch测试 类型断言 类型查询 我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface).那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?目前常用的有两种方法: comma-ok断言 switch测试 1.comma-ok断言 Go语言里面有一个语法,可以直接判断是否是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,elem

  • go语言csrf库使用实现原理示例解析

    目录 引言 csrf小档案 一.CSRF及其实现原理 CSRF攻击示例 二.如何预防 三.CSRF包的使用及实现原理 csrf包的安装 基本使用 使用net/http包启动的服务 echo框架下使用csrf包 gin框架下使用csrf包 beego框架下使用csrf包 实现原理 csrf结构体 csrf包的工作流程 为什么GET.HEAD.OPTIONS.TRACE的请求方法不需要token验证 总结 引言 今天给大家推荐的是web应用安全防护方面的一个包:csrf.该包为Go web应用中常见

  • Java排序算法三之归并排序的递归与非递归的实现示例解析

    归并有递归和非递归两种. 归并的思想是: 1.将原数组首先进行两个元素为一组的排序,然后合并为四个一组,八个一组,直至合并整个数组: 2.合并两个子数组的时候,需要借助一个临时数组,用来存放当前的归并后的两个数组: 3.将临时数组复制回原数组对应的位置. 非递归的代码如下: package mergesort; import java.util.Arrays; import java.util.Random; import java.util.Scanner; //归并排序的非递归算法 publ

  • Android统一依赖管理的三种方式总结

    目录 简述 传统apply from的方式(也是我以前项目中使用) buildSrc方式 什么是buildSrc 小结 Composing builds 什么是Composing builds 小结 Composing builds项目实战 在项目中新建一个model,用于管理配置信息 新建一个ConfigPlugin的类,不用具体的实现 编辑configPluginmodel中的build.gradle文件 修改根目录的settings.gradle文件 项目目录引入插件 在configPlu

  • go语言方法集为类型添加方法示例解析

    目录 1概述 2为类型添加方法 2.1基础类型作为接收者 2.2结构体作为接收者 3值语义和引用语义 4方法集 4.1类型 *T 方法集 4.2类型 T 方法集 5匿名字段 5.1方法的继承 5.2方法的重写 6方法值和方法表达式 6.1方法值 6.2方法表达式 1概述 在面向对象编程中,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些函数,这种带有接收者的函数,我们称为方法(method).本质上,一个方法则是一个和特殊类型关联的函数. 一个面向对象的程序会用方法来表达其属性

  • go语言通过结构体生成json示例解析

    目录 通过结构体生成json 通过map生成json json解析到结构体 json解析到map 通过结构体生成json buf, err := json.MarshalIndent(s, "", " ") //格式化编码 package main import ( "encoding/json" "fmt" ) //成员变量名首字母必须大写 type IT struct { Company string `json:&quo

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • go语言数组及结构体继承和初始化示例解析

    目录 分类 数组 数组定义 结构体 结构体继承 结构体初始化 成员的操作 同名字段 其它匿名字段 非结构体类型 结构体指针类型 结构体字段实现接口 分类 类型 名称 长度 默认值 说明 pointer 指针   nil   array 数组   0   slice 切片   nil 引⽤类型 map 字典   nil 引⽤类型 struct 结构体       数组 如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储.但是,问题是班级有80个学生,那么要定义80

  • C语言内存管理及初始化细节示例详解

    目录 地址空间 指针与内存关系 内存分配与初始化细节 内存泄漏 Cookie 地址空间 首先我们回味一下之前的老图,这个图由于是我手残加 ppt 即时创作,又因为是C语言入门时讲的,内容非常粗糙磕碜.要仔细研究这张图我们应该将它翻转90度会更加容易理解更贴近原理: 我们所熟知的,栈区数据存储的地址是从高地址到低地址,堆区数据存储的地址则是由低到高,而堆区下面可细分为未初始化和已初始化的全局数据区,字符常量区和代码区.而细心的你可能注意到了我代码区下面留了一撮空间代表下面还有,但这一撮属于灰色地带

随机推荐