GOPATH和Go Modules

news/2025/2/13 6:28:28/

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


http://www.ppmy.cn/news/1155151.html

相关文章

王阳明学习笔记

王阳明(一)溺 少年时五溺 任侠、骑射、辞章、神仙、佛氏。 始归正于圣贤之习。 今天的人们需要王阳明吗 35岁王阳明的至暗时刻,投江之前因言遭到了宦官的迫害,熬过酷刑,被贬放,留下了告终词和两首绝命诗。 1472王阳明出生在浙江…

Linux | 关于入门Linux你有必要了解的指令

目录 前言 1、ls指令 2、pwd指令 3、cd指令 4、touch指令 5、stat指令 6、mkdir指令 7、rmdir 与 rm指令 8、man指令 9、cp指令 10、mv指令 11、cat指令 (1)输入重定向 (2)输出重定向与追加重定向 12、less指令 1…

Yakit工具篇:简介和安装使用

简介(来自官方文档) 基于安全融合的理念,Yaklang.io 团队研发出了安全领域垂直语言Yaklang,对于一些无法原生集成在Yak平台中的产品/工具,利用Yaklang可以重新编写 他们的“高质量替代”。对于一些生态完整且认可度较高的产品,Y…

嵌入式实时操作系统的设计与开发(轮询系统学习)

轮询系统具有以下工作特点:系统完成一个轮询的时间取决于循环中需要执行的函数个数。此外,轮询的次序是静态固定的,在运行时不能进行动态调整。 典型系统 许多工业线程网络中,由于需要控制的设备较多、相互距离又较远&#xff0…

LeetCode每日一题:1488. 避免洪水泛滥(2023.10.13 C++)

目录 1488. 避免洪水泛滥 实现代码与解析: 贪心 原理思路: 1488. 避免洪水泛滥 题目描述: 你的国家有无数个湖泊,所有湖泊一开始都是空的。当第 n 个湖泊下雨前是空的,那么它就会装满水。如果第 n 个湖泊下雨前是…

C++——C++入门

C 前言一、认识C二、C入门C关键字(C98)命名空间命名空间定义命名空间使用 C输入&输出缺省参数缺省参数概念缺省参数分类 函数重载函数重载概念C支持函数重载的原理--名字修饰(name Mangling) 总结 前言 C的学习开始啦! 来吧~让我们拥抱更广阔的知识海洋&#x…

解决:由于找不到 VCRUNTIME140_.dll,无法继续执行代码。重新安装程序可能会解决此问题

最近我在安装一个软件时,遇到过这样的问题“由于找不到 VCRUNTIME140 1.dll,无法继续执行代码。重新安装程序可能会解决此问题”。 要解决这个问题,你可以按照以下步骤进行操作: 1. 重新安装程序: 尝试重新安装使用…

【数据结构】二叉树链式存储及遍历

二叉树链式存储及遍历 文章目录 二叉树链式存储及遍历前言实现过程代码实现源代码总结 前言 本文章中的内容参考于王道数据结构考研书,如果你对该部分的内容的记忆有所模糊,可以阅读我的文章再加深印象 实现过程 1.定义二叉树结构体 2.初始化二叉树的根结…