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包下进行编程的问题,也解决了第三方依赖包难以管理的问题

相关推荐
东方醴歌2 小时前
VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问
开发语言·后端·golang
LuckyLay2 小时前
LeetCode算法题(Go语言实现)_39
算法·leetcode·golang
东方醴歌4 小时前
本地搭建直播录屏应用并实现使用浏览器远程控制直播间录屏详细教程
开发语言·后端·golang
ILHONG4 小时前
码云如何构建自己的golang内源包
开发语言·后端·golang
不知名美食探索家16 小时前
【11】Redis快速安装与Golang实战指南
redis·golang·bootstrap
普通网友16 小时前
内置AI与浏览器的开源终端Wave Terminal安装与远程连接内网服务器教程
开发语言·后端·golang
行思理17 小时前
go语言应该如何学习
开发语言·学习·golang
returnShitBoy17 小时前
Go语言中的垃圾回收是如何工作的?
java·jvm·golang
普通网友18 小时前
如何在CentOS部署青龙面板并实现无公网IP远程访问本地面板
开发语言·后端·golang
LuckyLay1 天前
LeetCode算法题(Go语言实现)_38
算法·leetcode·golang