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

 更新时间:2023年01月19日 08:43:29   作者:啵啵肠  
这篇文章主要介绍了Go语言依赖管理三要素及示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

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

对于较简单的单体函数而言,只需要依赖原生的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语言依赖管理的资料请关注脚本之家其它相关文章!

相关文章

  • GO语言入门学习之基本数据类型字符串

    GO语言入门学习之基本数据类型字符串

    字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样,下面这篇文章主要给大家介绍了关于GO语言入门学习之基本数据类型字符串的相关资料,需要的朋友可以参考下
    2022-04-04
  • 用gomock进行mock测试的方法示例

    用gomock进行mock测试的方法示例

    go-mock是专门为go语言开发的mock库,该库使用方式简单,支持自动生成代码,这篇文章主要介绍了用gomock进行mock测试的方法示例,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 深入了解Golang中的格式化输出

    深入了解Golang中的格式化输出

    fmt是Go语言中用于控制文本输出的常用标准库,文中将通过示例详细讲解一下Go语言中不同形式的格式化输出,感兴趣的小伙伴可以了解一下
    2022-11-11
  • 浅析Go语言容器之数组和切片的使用

    浅析Go语言容器之数组和切片的使用

    在 Java 的核心库中,集合框架可谓鼎鼎大名:Array 、List、Set等等,随便拎一个出来都值得开发者好好学习如何使用甚至是背后的设计源码。虽然Go语言没有如此丰富的容器类型,但也有一些基本的容器供开发者使用,接下来让我们认识一下这些容器类型吧
    2022-11-11
  • Go tablewriter库提升命令行输出专业度实例详解

    Go tablewriter库提升命令行输出专业度实例详解

    命令行工具大家都用过,如果是运维人员可能会编写命令行工具来完成各种任务,命令行输出的美观和易读性往往容易被忽视,很烂的输出会让人感觉不专业,本文将介绍Go语言中牛逼的实战工具tablewriter库,使你在命令行输出中展现出专业的一面
    2023-11-11
  • golang如何使用gos7读取S7200Smart数据

    golang如何使用gos7读取S7200Smart数据

    文章介绍了如何使用Golang语言的Gos7工具库读取西门子S7200Smart系列PLC的数据,通过指定数据块号、起始字节偏移量和数据长度,可以精确读取所需的数据,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • GO语言运行环境下载、安装、配置图文教程

    GO语言运行环境下载、安装、配置图文教程

    这篇文章主要介绍了GO语言运行环境下载、安装、配置图文教程,需要的朋友可以参考下
    2017-02-02
  • golang 之 wire 库的使用小结

    golang 之 wire 库的使用小结

    Wire是一个用于Go语言的编译时依赖注入库,通过代码生成提高性能和可维护性,它支持编译时依赖注入、类型安全、简单易用等功能,文章通过代码示例展示了如何使用Wire进行依赖注入,并探讨了其优点如解耦、可测试和维护性,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • golang切片拷贝的实现

    golang切片拷贝的实现

    在Golang中,切片的浅拷贝只复制指向对象的指针,而深拷贝则复制数据本身,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • 并发安全本地化存储go-cache读写锁实现多协程并发访问

    并发安全本地化存储go-cache读写锁实现多协程并发访问

    这篇文章主要介绍了并发安全本地化存储go-cache读写锁实现多协程并发访问,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论