GOPATH和Go Modules

2023-10-11 23:20
文章标签 go modules gopath

本文主要是介绍GOPATH和Go Modules,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go语言的包依赖管理经历了几次变革

最早的时候,Go所依赖的所有的第三方库都放在GOPATH目录下面

go v1.5引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等

go v1.11开始,引入Go Module 作为依赖解决方案,到v1.16 Go Module作为默认依赖管理工具

一、GOPATH

GoPath是一个环境变量,指定了存放源代码、编译后的二进制文件和包依赖的根目录。

在设置 GOPATH 环境变量后,Go 编译器和相关工具会使用该路径作为默认的工作目录。具体来说,GOPATH 目录下包含了三个主要的子目录:

src:源代码存放目录,包括你自己的项目代码和导入的外部包。
pkg:编译后的包文件存放目录,包括使用 go install 命令生成的二进制文件。
bin:可执行文件存放目录,包括使用 go install 命令生成的可执行文件。

在使用 go get 命令安装包时,它们将被下载到 $GOPATH/src 目录中,并在 pkg 目录中生成相应的二进制文件。三方包只要不是官方库,都需要放置在GOPATH/src的路径下才可以使用。

GOPATH 模式下,go get 命令使用时,没有版本选择机制,拉下来的依赖代码都会默认当前最新版本,而且如果当项目 A 和项目 B 分别依赖项目 C 的两个不兼容版本时, GOPATH 路径下只有一个版本的 C 将无法同时满足 A 和 B 的依赖需求。

二、Go Modules

Go Modules 是 Go 语言的包管理系统,用于管理项目的依赖关系和版本控制,旨在解决 GOPATH包管理的一些问题。

Go Modules 允许每个项目都拥有自己的独立依赖项集合,并提供了更精细的版本控制和依赖管理功能。使用 Go Modules,每个项目都包含一个 go.mod 文件,用于定义项目的模块和依赖项。类似Java Maven的做法,将第三方库储存在本地的空间,并且给项目代码去引用。

go.mod 文件记录了项目所依赖的包及其版本约束。它包含了以下信息:

模块路径:指定当前项目的模块路径,通常是代码托管服务的 URL 或本地文件系统路径。
依赖项列表:列出了项目所依赖的包以及它们的版本约束。版本约束可以是精确的版本号,也可以是语义化版本控制(Semantic Versioning)的范围表达式。
替代模块:允许替换依赖项的特定版本,例如使用本地修改的包或替代的第三方包。


当构建项目时,Go Modules 会自动下载和管理所需的包,并将它们安装到项目的缓存目录中(默认为 $GOPATH/pkg/mod)。这样,每个项目都可以独立地管理其依赖项,而不会相互干扰。

Go Modules 还支持版本控制,允许指定包依赖的版本范围。在构建项目时,Go Modules 会选择符合依赖约束的最新版本。开发人员可以使用命令如 go get、go build、go test 等来管理和构建项目的依赖项。

总结来说,Go Modules 是一种现代化的包管理系统,通过模块文件 (go.mod) 管理项目的依赖关系和版本控制。它提供了更灵活、独立和可控的方式来管理 Go 语言项目的包依赖。

总结

GoPath所引出的问题,就是因为第三方类库的包所导致的,所以在有了GoModule之后,GoPath和GoModule就分别负责不同的职责,共同为Golang项目服务

GoPath用来存放我们从网上拉取的第三方依赖包
GoModule用来存放我们自己的Golang项目文件,当自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件去引用GoPath目录pkg包下的mod文件夹下的第三方依赖即可

这样以来,既解决了原来只能局限在GoPath目录src包下进行编程的问题,也解决了第三方依赖包难以管理的问题

这篇关于GOPATH和Go Modules的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191585

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go 1.23中Timer无buffer的实现方式详解

《Go1.23中Timer无buffer的实现方式详解》在Go1.23中,Timer的实现通常是通过time包提供的time.Timer类型来实现的,本文主要介绍了Go1.23中Timer无buff... 目录Timer 的基本实现无缓冲区的实现自定义无缓冲 Timer 实现更复杂的 Timer 实现总结在

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.