Go语言的依赖管理 | 青训营笔记

简介: 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命令如下:

lua

复制代码

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,删除无用的modulego 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

小结

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

目录
相关文章
|
17天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
27 7
|
17天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
17天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
92 71
|
16天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
100 67
|
17天前
|
存储 Go
go语言中映射
go语言中映射
32 11
|
18天前
|
Go 索引
go语言修改元素
go语言修改元素
25 6
|
9天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
|
20天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
40 3
|
1月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
32 3