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

小结

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

目录
相关文章
|
5天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
3天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
11 2
|
3天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
14 2
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
3天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
10 4
|
3天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
14 1
|
5天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
9天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
|
8天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
30 7
|
8天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
38 5