Go Module详解

文章目录

  • 基本介绍
  • 相关环境变量
  • Go Module的使用
    • 初始化项目(go mod init)
    • 管理依赖项(go mod edit)
    • 获取依赖项(go mod download)
    • 整理依赖项(go mod tidy)
    • 导入vendor目录(go mod vendor)
    • 查询依赖原因(go mod why)
    • 查询依赖结构(go mod graph)
    • 验证依赖项完整性(go mod verify)
  • go get命令
  • go list命令

基本介绍

基本介绍

Go Module是Go语言的官方依赖管理解决方案,其提供了一种简单、可靠的方式来管理项目的依赖关系。Go Module于Go1.11发布,并于Go1.14准备正式用于生产,Go官方也鼓励用户从其他的依赖管理工具迁移到Go Module。

Go Module主要解决了如下几个问题:

  • 依赖管理:在引入Go Module之前,Go语言没有官方的依赖管理系统,开发人员需要手动下载和管理项目的依赖包。Go Module中提供了一种标准化的依赖管理解决方案,使开发人员能够轻松定义、下载和更新项目的依赖项。
  • 版本冲突:在原始的GOPATH模式中,多个项目共享同一个全局的依赖包集合,往往会导致版本冲突。Go Module中引入了模块版本的概念,每个模块都有明确的版本号,并通过go.mod文件中的版本要求来解决版本冲突问题。
  • 可重复构建:在GOPATH模式中,项目的构建结果受到GOPATH环境变量的影响,同一项目在不同环境下可能产生不一致的构建结果。Go Module中使用go.mod文件明确指定项目的依赖关系和版本要求,确保在不同环境下构建结果的一致性和可重复性。
  • 跨模块引用:在GOPATH模式中,无法直接引用其他项目中的代码,必须将代码复制到自己的项目中,或使用第三方工具来管理跨项目的共享代码。Go Module中允许直接引用其他模块中的代码,简化了代码的复用和共享,提高了开发效率。
  • 私有库支持:在GOPATH机制中,私有库的使用相对复杂,需要设置特殊的目录结构或使用第三方工具。Go Module中提供了对私有库的官方支持,开发人员可以使用私有代码块,并通过身份验证或代理来管理私有模块的访问权限。

相关环境变量

相关环境变量

通过go env命令可以查看与Go相关的环境变量信息。如下:

在这里插入图片描述

其中,与Go Module相关的环境变量主要有如下几个:

  • GO111MODULE:用于启用或禁用Go Module功能。设置为on和off分别表示启用和禁用Go Module功能,设置为auto表示根据当前目录下是否包含go.mod文件来决定是否启用Go Module功能。
  • GOPROXY:用于设置模块代理的地址,多个代理地址之间使用逗号分隔。设置为off表示禁用模块代理,direct表示从源代码仓库下载模块。
  • GONOPROXY:用于设置不需要通过代理访问的模块路径列表,多个模块路径之间使用逗号分隔,这些模块将会直接从源代码仓库下载。
  • GOSUMDB:用于配置Go语言中模块验证的校验和的数据源。
  • GONOSUMDB:用于设置不参与校验和验证的模块路径列表,多个模块路径之间使用逗号分隔。
  • GOPRIVATE:用于设置不在公共代码仓库上的私有模块路径列表,多个模块路径之间使用逗号分隔。

说明一下:

  • 在使用Go Module之前,需要确保GO111MODULE环境变量的值不为off,如果Go Module功能未启用,可通过go env -w GO111MODULE=on命令开启Go Module功能。
  • 如果将GOPROXY环境变量的值设置为off,意味着Go Module不会通过代理服务器来获取模块,此时Go Module默认会尝试从模块的导入路径所对应的源代码仓库下载模块,比如要下载的模块的导入路径为github.com/username/module,那么Go Module会直接从GitHub上的github.com/username/module仓库下载模块的代码。
  • GOPROXY环境变量的值默认为https://proxy.golang.org,direct,在GOPROXY最后设置direct,意味着当无法从列出的代理服务器中获取所需模块时,直接从源代码仓库获取模块,即尝试使用获取模块的默认方式进行获取,确保代理服务器无法获取的模块,仍然能够从源代码仓库获取。
  • https://proxy.golang.org是Go团队提供并由Google托管的Go模块代理服务,https://goproxy.cn是中国开发者提供的Go模块代理服务,为了提高Go Module下载模块的速度,通常会将GOPROXY的值设置为https://goproxy.cn,direct。

Go Module的使用

初始化项目(go mod init)

初始化项目

go mod init命令用于初始化一个新的Go模块,该命令会在当前目录下创建一个名为go.mod的文件。如下:

在这里插入图片描述

生成的go.mod文件如下:

module github.com/chenlong-cxy/go-module-testgo 1.20

鉴于当前go.mod文件的内容过于简单,为了进一步讲解go.mod文件的内容,下面给出一个较为复杂的go.mod文件示例。如下:

module module-pathgo 1.20require (github.com/zhagnsan/test1 v1.1.3github.com/zhagnsan/test2 v1.2.3github.com/zhagnsan/test3 v1.2.4 // indirect
)replace github.com/zhangsan/test1 v1.1.3 => github.com/lisi/test1 v1.3.4
replace github.com/zhangsan/test2 v1.2.3 => github.com/lisi/test2 v1.3.4exclude (github.com/zhangsan/test1 v1.1.1github.com/lisi/test2 v1.2.3
)

go.mod文件大致包括如下几个部分:

  • module:表示模块声明,用于定义当前项目的模块路径。
  • go:表示Go版本要求,用于标识当前模块的Go语言版本,值为初始化模块时的Go版本。
  • require:表示依赖项声明,用于指明当前模块所依赖的其他模块,每个依赖项由模块路径和模块版本组成,indirect表示间接依赖。
  • replace:表示依赖项替换,用于指明所依赖的某个模块的替代模块。
  • exclude:表示依赖排除,用于指明需要被排除的特定模块及其版本,以阻止某些模块被下载或用作依赖项。

说明一下:

  • 使用go mod init命令时,需要在命令后指明待初始化模块的模块路径,所指明的模块路径将被设置为go.mod文件中的模块声明。模块路径通常是项目的版本控制仓库的地址,这样当其他开发人员使用该模块时,Go Module就能直接从该模块的导入路径对应的源代码仓库下载该模块。如果项目只是用于本地测试,也可以将模块路径简单的设置为项目名称。

管理依赖项(go mod edit)

管理依赖项

go mod edit命令用于编辑go.mod文件的内容。常用的选项如下:

  • -require:用于添加或更新当前模块所依赖的某个模块,即在go.mod文件中添加或更新require条目。
  • -replace:用于指明当前模块所依赖的某个模块的替代模块,即在go.mod文件中添加replace条目。
  • -exclude:用于指明需要被排除的特定模块及其版本,即在go.mod文件中添加exclude条目。
  • -droprequire:用于删除当前模块所依赖的某个模块,即在go.mod文件中删除require条目。

为了演示Go Module的使用,我们在项目目录下分别创建main文件夹和model文件夹,main文件夹中包含一个main.go文件,model文件夹中包含一个student.go文件。如下:

在这里插入图片描述

其中,student.go文件中定义了一个Student结构体,并对外提供了一个函数用于创建Student实例。如下:

package modeltype Student struct {Name stringAge  int
}func NewStudent(name string, age int) Student {return Student{Name: name,Age:  age,}
}

main.go中创建了一个Student实例,并通过logrus模块中的Infof函数对其进行了打印。如下:

package mainimport ("github.com/chenlong-cxy/go-module-test/model""github.com/sirupsen/logrus"
)func main() {stu := model.NewStudent("Alice", 14)logrus.Infof("student info is %+v", stu)
}

由于项目当中用到了logrus模块,因此需要通过go mod edit命令在go.mod文件中添加logrus模块的依赖声明。如下:

在这里插入图片描述

执行命令后可以看到,go.mod文件中新增了对应的require条目。如下:

module github.com/chenlong-cxy/go-module-testgo 1.20require github.com/sirupsen/logrus v1.9.3

说明一下:

  • logrus是一个流行的Go语言日志库,其提供了丰富的日志记录功能和灵活的配置选项,被广泛应用于Go语言项目中。
  • 在Go Module模式下,通过import "模块路径/包相对于模块的路径"的方式导入对应的包,导入当前项目中的包也是如此。

获取依赖项(go mod download)

获取依赖项

go mod download命令用于下载项目所依赖的各个模块,其会根据go.mod文件下载相应的模块到Go Module缓存中。如下:

在这里插入图片描述

执行go mod download命令后,会在当前目录下生成一个名为go.sum的文件,该文件用于记录当前模块所依赖的各个模块的校验和信息。当前go.sum文件内容如下:

github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

与此同时,在Go Module缓存路径下可以看到被下载的模块。如下:

在这里插入图片描述

说明一下:

  • 在Go Module模式中,原则上不必再设置GOPATH环境变量,这时$HOME/go/pkg/mod将会作为Go Module的缓存路径,用于存放Go Module下载的模块,但如果你设置了GOPATH环境变量,那么$GOPATH/pkg/mod将优先作为Go Module的缓存路径。
  • 在使用go mod download命令时,也可以在后面指明需要下载的模块及其版本,这时Go Module会下载相应的模块到Go Module缓存中,以供后续构建使用。
  • 当使用Go Module下载项目依赖的模块时,每个下载的模块都会有一个相应的校验和,go.sum文件记录了这些校验和以及每个模块的版本信息,用于验证模块文件在下载和使用过程中是否被篡改或损坏。

整理依赖项(go mod tidy)

整理依赖项

go mod tidy命令用于自动管理项目的依赖项,该命令会检测当前项目缺失的依赖项、不再使用的依赖项以及依赖项的版本是否需要更新,并自动对所需的依赖项进行下载,然后更新go.mod和go.sum文件。如下:

在这里插入图片描述

例如,在当前项目执行go mod tidy命令后,其检测到项目中有一个间接依赖的模块未被添加,于是会自动下载缺失的依赖项,并将其添加到go.mod文件中。如下:

module github.com/chenlong-cxy/go-module-testgo 1.20require github.com/sirupsen/logrus v1.9.3require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect

至此当前的项目已经可以运行了,运行程序后可以看到通过logrus模块输出的Student信息。如下:

在这里插入图片描述

导入vendor目录(go mod vendor)

导入vendor目录

go mod vendor命令用于将项目依赖的各个模块,复制到项目的vendor目录中。如下:

在这里插入图片描述

执行go mod vendor命令后,在项目目录下会生成一个vendor目录,该目录下包含了当前项目依赖的各个模块的代码。如下:

在这里插入图片描述

说明一下:

  • 在构建和部署项目时,如果项目中存在vendor目录,那么Go会直接使用vendor目录中的依赖项,如果vendor目录中没有对应的依赖项则会产生报错,因此需要确保vendor目录下包含当前项目的所有依赖项。
  • vendor目录只包含各个依赖模块的源代码,各个模块的测试文件不会被复制到vendor目录下。此外,修改vendor目录下各个模块的源代码,不会影响到Go Module缓存中对应模块的源代码。

查询依赖原因(go mod why)

查询依赖原因

go mod why命令用于解析模块依赖关系,并解释为什么某个模块被包含在项目的依赖项中。如下:

在这里插入图片描述

查询依赖结构(go mod graph)

查询依赖结构

go mod graph命令用于生成当前模块的依赖关系图,以展示项目中各个模块之间的依赖关系。如下:

在这里插入图片描述

验证依赖项完整性(go mod verify)

验证依赖完整性

go mod verify命令用于验证当前模块的依赖项的完整性和一致性,它会检查Go Module缓存中当前项目所依赖的各个模块的校验和,与go.sum文件中记录的校验和是否一致,以确保所依赖的模块未被篡改或损坏。如下:

在这里插入图片描述

说明一下:

  • 如果go mod verify命令输出错误信息,表明Go Module缓存中对应模块的代码与最初下载的代码不一致,该模块的代码可能被篡改或损坏,此时应该重新下载该模块的代码。

go get命令

go get命令

go get命令用于下载指定的模块,并将其存放到Go Module缓存中。常用的选项如下:

  • -u:表示获取并更新指定模块及其依赖项的最新版本。
  • -t:表示获取指定模块及其相关的测试依赖项。
  • -d:表示仅获取指定模块的源代码,而不进行安装。
  • -insecure:表示允许在不验证HTTPS证书的情况下获取指定模块。

例如,下面演示了如何通过go get命令获取logrus模块。如下:

在这里插入图片描述

说明一下:

  • 在使用go get命令下载指定模块时,如果没有指明模块的版本,则默认获取该模块的最新版本。
  • go get在获取模块时,如果被获取的模块中包含bin目录,那么go get会将bin目录中的可执行文件安装到Go Module缓存中的bin目录下,如果只希望下载模块的源代码而不进行安装,则需要携带-d选项。

go get与go mod download

go get和go mod download命令都用于下载模块,但它们之间存在一些区别。主要区别如下:

  • go get在下载指定模块时,会自动下载该模块所依赖的其他模块,而go mod download在下载指定模块时,只会下载指定的模块,不会下载该模块所依赖的其他模块。
  • go get在下载指定模块的源代码后,还会进行安装操作,而go mod download只会下载指定模块的源代码,不会进行安装操作。
  • go get在下载指定模块后,会将该模块作为依赖添加到go.mod文件中,并将该模块对应的检验和信息添加到go.sum文件中,而go mod download不会对go.mod和go.sum文件进行更新。
  • go get在下载指定模块时,如果没有指明模块的版本,会默认获取该模块的最新版本,而go mod download在下载指定模块时必须指明待下载的版本。

go list命令

go list命令

go list命令用于查询指定模块或go文件的各项信息。常用的选项如下:

  • -json:表示以JSON格式输出指定模块或go文件的详细信息。
  • -m:表示查询指定模块的信息,包括模块的路径和版本信息。
  • -u:表示查询指定模块的最新版本。
  • -version:表示查询指定模块可用的版本列表。

例如,下面演示了如何通过go list命令查询logrus模块可用的版本列表。如下:

在这里插入图片描述

说明一下:

  • go list命令可以查询指定模块或指定go文件的各项信息,在没有携带-m选项的情况下,go list命令默认查询指定go文件或指定路径下所有go文件的信息,而只有模块才有版本的概念,因此在查询指定模块的版本列表时需要携带-m选项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DevOps】Ubuntu基本使用教程

目录 引言 Ubuntu简介 安装Ubuntu 准备工作 创建启动盘 安装过程 桌面环境 基本操作 定制桌面 文件管理 文件操作 文件权限 软件管理 安装软件 更新软件 系统设置 用户账户 网络设置 电源管理 命令行操作 常用命令 管理权限 安全与维护 系统更新 备份…

傲星一个在线工具箱源码附搭建教程

傲星工具箱源码是一款功能强大的在线工具箱程序,您可以通过安装扩展来增强其功能。同时,该程序还提供了插件模板的功能,让您可以将其作为网页导航使用。 1.PHP版本需不低于7.2.5。 2.Mysql版本需不低于5.7。 3.需要安装fileinfo扩展。 4.…

蓝牙音频解码芯片TD5163介绍,支持红外遥控—拓达半导体

蓝牙芯片TD5163A是一颗支持红外遥控、FM功能和IIS音频输出的蓝牙音频解码芯片,此颗芯片的亮点在于同时支持真立体声&单声道、TWS功能、PWM、音乐频谱和串口AT指令控制等功能,芯片在支持蓝牙无损音乐播放的同时,还支持简单明了的串口发送A…

idea有这个类却报红,无法用快捷键找到

idea有这个类却报红,无法用快捷键找到,但是项目启动却没有任何问题,严重影响到了开发效率,关idea 重新打开没有用。 找了一圈,办法如下: 1、点击左上角的 File—>Invalidate Caches/Restar 2、点击 In…

企业如何禁止员工电脑插u盘?禁用U盘的七个方法

禁止电脑插入U盘其实很简单,有多种方法,有适合个人的有适合企业的,今天一次性给你介绍清楚。 1.禁用USB端口: 通过组策略:在Windows域环境中,管理员可以使用组策略来禁用所有或部分USB端口。这可以通过编…

云手机的 Socks5 网络配置指南

当你在使用云手机之前,了解和正确配置 Socks5 网络代理是提升其性能和功能的关键一步; 直白点来说利用 Socks5 代理进行网络配置,可以带来诸多优势。 什么是socks5? Socks5 是一种重要的网络代理协议,主要功能在于它…

计算机哈佛架构、冯·诺依曼架构对比

哈佛架构和冯诺依曼架构是两种不同的计算机系统架构,它们在存储器组织方式上有着显著的区别。下面是它们的原理、优缺点的对比以及一些常见的 MCU 采用的架构: 哈佛架构: 原理:哈佛架构将指令存储器(程序存储器&#x…

【后端】Java学习笔记(二周目-1)

环境 安装JDK8并配置环境变量 jvm核心类库jre jre开发工具jdk Java基础运行流程,代码从上到下,从左往右,只运行一次 桌面—>新建文件夹—>新建记事本—>打开编写代码 public class Hello{public static void main(String[] arg…

如何一键拷贝PPT中的所有文字?

有时我们可能需要引用PPT的文字,但一个幻灯片一个幻灯片拷贝很是麻烦,我们想一键拷贝PPT中所有幻灯片中的内容(最近我就遇到了这个需求)。今天就来讲讲这个一键拷贝的技巧。因为大家可能会遇到同样的问题,所以在此记录…

一文彻底理解机器学习 ROC-AUC 指标

在机器学习和数据科学的江湖中,评估模型的好坏是非常关键的一环。而 ROC(Receiver Operating Characteristic)曲线和 AUC(Area Under Curve)正是评估分类模型性能的重要工具。 这个知识点在面试中也很频繁的出现。尽管…

【机器学习】与【数据挖掘】技术下【C++】驱动的【嵌入式】智能系统优化

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析:使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…

零基础入门学用Arduino 第二部分(二)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

通用大模型与垂直大模型:双轨并进的人工智能未来

在人工智能(AI)的浩瀚宇宙中,大模型以其强大的学习能力和广泛的适用性,正逐步成为推动技术进步和产业革新的核心动力。在这股浪潮中,通用大模型与垂直大模型如同两颗璀璨的星辰,各自散发着独特的光芒,共同照亮了AI发展…

VirtualBox配置双网卡实现宿主机和虚拟机相互访问以及虚拟机外网访问

目录 一:背景 二:实现 三:总结 一:背景 在VirtualBox中配置虚拟机以实现本地主机远程登录、访问外网以及虚拟机之间的相互访问,是一种常见的虚拟化实践,适用于多种场景,如开发、测试和远程工…

openh264 帧内预测编码原理:WelsMdI4x4Fast 函数

介绍 说明:该函数内部原理类似WelsMdI4x4函数,具体可以参考:openh264 帧内预测编码原理:WelsMdI4x4 函数。 功能:针对4x4像素块的帧内模式决策的快速实现逻辑原型: int32_t WelsMdI4x4Fast (sWelsEncCtx…

react的自定义组件

// 自定义组件(首字母必须大写) function Button() {return <button>click me</button>; } const Button1()>{return <button>click me1</button>; }// 使用组件 function App() {return (<div className"App">{/* // 自闭和引用自…

React Redux

React Redux是Redux的官方React UI绑定层。它允许您的React组件从Redux存储读取数据&#xff0c;并将操作分派到存储以更新状态。redux是一个管理状态数据state的容器。提供了可预测的状态管理。 React Redux 8.x需要React 16.8.3或更高版本/Rect Native 0.59或更高&#xff0c…

在AMD GPU上加速大型语言模型的Flash Attention

Accelerating Large Language Models with Flash Attention on AMD GPUs — ROCm Blogs 引言 在这篇博客文章中&#xff0c;我们将指导您如何在AMD GPU上安装Flash Attention&#xff0c;并提供与在PyTorch中标准SDPA比较其性能的基准测试。我们还将测量Hugging Face中多个大型…

【Java】解决Java报错:FileNotFoundException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 文件路径错误2.2 文件名拼写错误2.3 文件权限问题2.4 文件路径未正确拼接 3. 解决方案3.1 检查文件路径3.2 使用相对路径和类路径3.3 检查文件权限3.4 使用文件选择器 4. 预防措施4.1 使用配置文件4.2 使用日志记录4.3 使用单元测…

上网行为管理的作用是什么?有哪些上网行为管理软件?

上网行为管理在现代企业及家庭环境中扮演着至关重要的角色&#xff0c;其作用不仅限于提升网络安全性&#xff0c;还涉及保护企业信息安全、提高员工工作效率等多个方面。以下将详细阐述上网行为管理的作用&#xff0c;并介绍几款主流的上网行为管理软件。 一、上网行为管理的作…