依赖管理(go mod)
目录
各版本依赖管理的时间分布
一、GOPATH
1. GOROOT是什么
定义:
作用:
默认值:
是否需要手动设置:
查看当前的 GOROOT:
2. GOPATH:工作区目录
定义:
作用:
默认值:
目录结构:
如何设置 GOPATH:
查看当前的 GOPATH:
缺点:
GOROOT 与 GOPATH 的主要区别
总结
二、Vendor
三、Go Module
1、module的定义
语义化版本的规范
2、快速实战
Go Module 与 go mod 的区别
举例
总体来说:
3、go.mod 与 指令
1. go.mod 文件
go.mod 文件自动生成
2. go mod 命令行管理
2.1 go mod init
2.2 go mod tidy
2.3 go mod download
2.4 go mod vendor
2.5 go mod graph
2.6 go mod verify
Go的依赖管理主要经过了3个重要阶段
1、GOPATH
2、Vendor
3、Go Module
早期Go使用GOPATH进行依赖管理,但是GOPATH不方便管理多个版本。
后来增加了Vendor,允许把项目连同代码一起管理。
18年,Go1.11引入全新的依赖管理工具Go Module,直到Go1.14才走向成熟。
从GOPATH到vendor,再到Go Module,这是一个不断演进的过程,了解每代依赖管理的痛点,能够更好的明白下一代依赖管理的初衷。
故,我将会从GOPATH讲起,经过vendor最后到Go Module。
各版本依赖管理的时间分布
依赖管理方法 | 引入版本 | 时间 | 状态 |
GOPATH | Go 1.0 | 2012 年(Go 1.0) | Go 的早期依赖管理方式,已逐步被 Go Module 取代,但仍在支持 |
Vendor | Go 1.5 | 2015 年 | 一种解决 GOPATH 依赖冲突的过渡方案,Go 1.6 起成为默认方案,但现在被 Go Module 取代 |
Go Module | Go 1.11 | 2018 年(实验) | Go 1.13 起成为默认依赖管理方式,是目前官方推荐的管理方案 |
一、GOPATH
刚刚接触GO的新手,一般都对GOPATH感到困惑。通常由两方面造成的
Go语言解决办法有两种:
- 将从前的卸了,再亲自安装一次
- 听我下面的讲解 Ψ( ̄∀ ̄)Ψ
建议选择第二种方法,既然来到了这里,就要相信我的讲解。本部分主要介绍GOPATH及与其密切相关的GOROOT,首先看一下GOROOT。
1. GOROOT是什么
定义:
通常,我们说安装Go语言,实际上是安装Go的编译器与标准库,两者位于同一个安装包中。
假如在Windows上,使用Installer安装Go,他们会被默认安装到C:\Go目录下。该目录即为GOROOT目录。
里面包含了开发Go应用程序所需要的所有组件。如编译器、标准库和工具所在的位置。
它是 Go 语言自带的环境变量,用户通常无需更改。
作用:
- Go 编译器及工具链所在的目录。
- Go 的标准库代码(如 fmt、os 等)。
默认值:
安装 Go 语言时,GOROOT 会自动配置为安装目录的路径。例如:
- Windows 上:C:\Go
- macOS/Linux 上:/usr/local/go
是否需要手动设置:
一般不需要手动设置 GOROOT,Go 安装程序会自动配置。如果需要自定义(比如安装多个 Go 版本),可以手动设置环境变量 GOROOT。
查看当前的 GOROOT:
go env GOROOT // 查看路径
2. GOPATH:工作区目录
定义:
GOPATH 是 Go 工作区目录,用于存放:
- 代码:所有项目的源码(src)。
- 依赖包:第三方库的下载路径(pkg)。
- 可执行文件:编译后的二进制文件(bin)。
作用:
- Go 工具链在哪里查找和存储你的 Go 项目和依赖。
- go install 和 go build 命令,生成可执行文件或中间文件。
默认值:
如果没有显式设置,Go 会将 GOPATH 默认设置为用户主目录下的 go 文件夹:
- Windows 上:%USERPROFILE%\go
- macOS/Linux 上:$HOME/go
目录结构:
一个典型的 GOPATH 目录结构如下:
GOPATH/├── bin/ # 存放可执行文件├── pkg/ # 存放已编译的依赖包└── src/ # 存放 Go 项目的源码
如何设置 GOPATH:
你可以手动设置 GOPATH 为自定义的目录(可多路径,但较少用)。例如:
# Linux/macOSexport GOPATH=/path/to/your/workspace# Windows(通过系统环境变量设置)set GOPATH=C:\path\to\your\workspace
查看当前的 GOPATH:
go env GOPATH
缺点:
GOPATH的优点是简单,但是不能很好的适应实际项目的工程需求。比如有两个项目A和B,如果两个项目都引用第三方库T,只是版本不同。
- 使用,T v1.0
- 使用,T v2.0
由于编译器固定依赖GOPATH / src 下查找GOPATH / src / T 这条路径,又因为无法在同一个GOPATH目录下储存T的两个版本。所以A、B无法共享同一个GOPATH,需要各自维护一个,带来极大的不便。针对GOPATH的缺点,Go语言社区提供了Vendor机制。从此依赖管理进入了第二阶段。
GOROOT 与 GOPATH 的主要区别
区别 | GOROOT | GOPATH |
定义 | Go 安装目录 | Go 工作区,存放用户项目和依赖 |
包含内容 | 标准库、编译器、工具等 | 用户源码、依赖包缓存、可执行文件等 |
是否可修改 | 一般不需要修改,由 Go 自动设置 | 用户可以设置为任意路径 |
使用场景 | Go 标准库查找、工具链使用 | 非模块化项目存储、编译生成文件 |
总结
- 指向 Go 安装目录,包含标准库和工具,不建议修改。
- 指向工作区目录,存放用户项目和依赖,是用户项目的主要工作目录。
二、Vendor
上部分,我们介绍了使用GOPATH的痛点:多个项目无法共享同一个GOPATH,虽然vendor仍然无法多个项目无法共享同一个GOPATH,但是它提供了一种机制,让项目的依赖隔离而不互相干扰。
自 Go 1.6起,vendor机制正式启用,它允许把项目存放在vendor的目录中,可以把这个vendor目录,简单的理解成私有的GOPATH目录。项目编译时,编译器会优先从vendor目录中寻找依赖包,如果在vendor中找不到,才会去GOPATH中寻找。
虽然vendor并未推出历史舞台,甚至在离线场合下更适用。
但是Go Module已成为主流,如果读者们想得到vendor更详细的资料,可以上网另行查询。
三、Go Module
在Go 1.11中,Module的特性首次被引用,标志着Go的依赖进入第三个时代。
Go Module 基本上解决了 GOPATH 和 vendor 时代的遗留问题,看到这里的读者基本能了解:
GOPATH 时代,最大的困惑时无法让多个项目共享package的不同版本。
在vendor时代,可以通过将每个项目依赖的 package 放到 vendor 中可以解决,但是使用 vendor的问题是无法很好的管理依赖package,比如升级package。
而Go Module 更像一种全新的依赖管理方案。
Go Module基础
1、module的定义
官方给 module 的定义是:A module is a collection of related Go packages that are versioned together as a single unit.
定义非常清晰,一组 package 的集合一起被标记版本,即一个 module。
通常而言,一个仓库包含一个 module(虽然也可以包含多个,但不推荐),所以仓库、module 和 package 的关系如下:
◎ 一个仓库包含一个或多个 module。
◎ 你每个module 包含一个或多个 package。
◎ 每个 package 包含一个或多个源文件。
另外,一个 module 的版本号规则必须遵循语义化规范,版本号必须使用v(major).(minor).(patch)格式,比如v0.1.0、v1.2.3等。
下方给出了,语义化版本的规范。
语义化版本的规范
语义化版本 (Semantic Versioning) 已成为事实上的标准,几乎知名的开源项目都遵循该规范,更详细的信息请前往 semver官网査看,在此只提炼一些要点,以便于后续的阅读。
版本格式 v(major).(minorr).(patch)中的 major 指的是大版本,minor 指的是小版本,patch 指的是补丁版本。
◎ major: 当发生不兼容的改动时才可以增加该版本,比如 v2.x.y与 v1.x.y是不兼容的。
◎ minor: 当有新增特性时才可以增加该版本,比如 v1.17.0 是在 v1.16.0的基础上增加了新的特性,同时兼容 v1.16.0。
◎ patch: 当有 Bug修复时才可以增加该版本,比如 v1.17.1修复了 v1.17.0 上的 Bug,没有增加新特性。
语义化版本规范的好处是,用户通过版本号就能了解版本信息。
2、快速实战
纸上得来终觉浅,觉知此事要躬行,后续我会在补充一下实战,让大家对Go Module认识的更加清楚。
讲到这里了,大家肯定对 go mod 与 Go Module 之间的差异有些许疑惑,接下来我来细细讲解。
Go Module 与 go mod 的区别
区别 | Go module | go mod 命令 |
定义 | Go 的模块化系统,用于管理依赖和版本 | Go 工具链中的子命令,用于操作和管理 Go module |
作用 | 使得 Go 项目支持依赖版本管理、减少冲突 | 具体操作模块的工具,包含初始化、下载、清理等子命令 |
使用方式 | 自动在项目根目录生成 go.mod 文件,记录模块的依赖信息 | 使用如 go mod init 等命令管理模块依赖 |
依赖管理 | 管理项目的依赖关系和版本控制 | 提供修改 go.mod 文件的命令,以方便操作模块 |
举例
在项目的根目录下:
# 初始化一个 Go module,会在当前目录生成 go.mod 文件go mod init my_project# 整理依赖,自动移除未使用的依赖包go mod tidy# 下载所有依赖go mod download
总体来说:
- module 是 的模块化系统的概念,它定义了依赖管理的机制。
- mod 是管理 Go module 的命令集合,用于具体执行对模块的各种操作。
3、go.mod 与 指令
在 Go 中,go.mod 文件和 go mod 命令行工具提供了依赖管理的核心功能。以下是详细说明。
1. go.mod 文件
go.mod 是 Go 项目的模块文件,用于定义模块名、依赖项和版本等信息。一个典型的 go.mod 文件示例如下:
module example.com/myappgo 1.20require (github.com/gin-gonic/gin v1.8.1golang.org/x/crypto v0.5.0
)replace golang.org/x/crypto v0.5.0 => ./local/crypto
- module:定义当前项目的模块路径,一般为代码仓库路径。
- go:指定所使用的 Go 版本(这里是 1.20)。
- require:列出当前模块所依赖的其他模块及其版本。
- replace:用于指定模块的替代版本或本地替代路径,通常在开发调试阶段使用。
go.mod 文件自动生成
可以通过在项目目录运行 go mod init <module_name> 来自动生成 go.mod 文件。例如,go mod init example.com/myapp。
2. go mod 命令行管理
go mod 命令行工具用于管理模块的依赖项和版本控制,以下是常用的命令:
2.1 go mod init <module_name>
初始化当前项目的模块系统,生成 go.mod 文件:
go mod init example.com/myapp
2.2 go mod tidy
清理依赖,移除不再使用的包并添加遗漏的包。
go mod tidy
- go mod tidy 会检查 go.mod 和 go.sum 文件,移除未引用的模块,并确保所有依赖项存在于 go.sum 文件中。
2.3 go mod download
下载依赖包到本地的模块缓存中,但不会修改 go.mod 文件。
go mod download
2.4 go mod vendor
将所有依赖的包下载到项目的 vendor 目录中。
go mod vendor
- Go 1.14 引入的 vendor 模式在构建项目时优先从 vendor 目录中查找依赖项,可以用来解决部署环境中网络不通畅的问题。
2.5 go mod graph
展示依赖模块之间的关系图,帮助理解依赖结构。
go mod graph
2.6 go mod verify
验证依赖的包文件是否正确,检查 go.sum 文件中保存的哈希值是否匹配下载的模块。
go mod verify
讲到这里也接近了尾声,创作本篇博客倾尽了全力,虽不免仍有些片面。但从基础上看,带领大家,重新认识了一遍依赖管理,并从GOPATH讲起,经过vendor最后到Go Module,还是不错的。
希望大家有收获,期待下次再见。
相关文章:
依赖管理(go mod)
目录 各版本依赖管理的时间分布 一、GOPATH 1. GOROOT是什么 定义: 作用: 默认值: 是否需要手动设置: 查看当前的 GOROOT: 2. GOPATH:工作区目录 定义: 作用:…...
Apple Vision Pro开发001-开发配置
一、Vision Pro开发硬件和软件要求 硬件要求软件要求 1、Apple Silicon Mac(M系列芯片的Mac电脑) 2、Apple vision pro-真机调试 XCode15.2及以上,调试开发和打包发布Unity开发者账号&&苹果开发者账号 二 、开启无线调试 1、Apple Vision Pro和Mac连接同…...
android 动画原理分析
一 android 动画分为app内的view动画和系统动画 基本原理都是监听Choreographer的doframe回调 二 app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动 wms来进行更新。这个流程是在app进程完成 这里不是我分析的重点 直接来看下系统动画里面的本地动…...
Elasticsearch 6.8 分析器
在 Elasticsearch 中,分析器(Analyzer)是文本分析过程中的一个关键组件,它负责将原始文本转换为一组词汇单元(tokens)。 分析器由三个主要部分组成:分词器(Tokenizer)、…...
实验室资源调度系统:基于Spring Boot的创新
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
实验三:构建园区网(静态路由)
目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网 IP 地址 3、任务 3:实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …...
3. SQL优化
SQL性能优化 在日常开发中,MySQL性能优化是一项必不可少的技能。本文以具体案例为主线,结合实际问题,探讨如何优化插入、排序、分组、分页、计数和更新等操作,帮助你实现数据库性能的飞跃。 一、索引设计原则 索引是MySQL优化的…...
web——upload-labs——第十一关——黑名单验证,双写绕过
还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…...
AWS CLI
一、AWS CLI介绍 1、简介 AWS CLI(Amazon Web Services Command Line Interface)是一个命令行工具,它允许用户通过命令行与 Amazon Web Services(AWS)的各种云服务进行交互和管理。使用 AWS CLI,用户可以直接在终端或命令行界面中执行命令来配置、管理和自动化AWS资源,…...
springboot:责任链模式实现多级校验
责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。 属于行为型模式…...
CentO7安装单节点Redis服务
本文目录 一、Redis安装与配置1.1 安装redis依赖1.2 上传压缩包并解压1.3 编译安装1.4 修改配置并启动1、复制配置文件2、修改配置文件3、启动Redis服务4、停止redis服务 1.5 redis连接使用1、 命令行客户端2、 图形界面客户端 一、Redis安装与配置 1.1 安装redis依赖 Redis是…...
FreeRTOS学习14——时间管理
时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数,…...
统⼀数据返回格式快速⼊⻔
为什么会有统⼀数据返回? 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维。 优点: 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本,因为所有接⼝都…...
Python学习------第十天
数据容器-----元组 定义格式,特点,相关操作 元组一旦定义,就无法修改 元组内只有一个数据,后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…...
Win11 24H2新BUG或影响30%CPU性能,修复方法在这里
原文转载修改自(更多互联网新闻/搞机小知识): 一招提升Win11 24H2 CPU 30%性能,小BUG大影响 就在刚刚,小江在网上冲浪的时候突然发现了这么一则帖子,标题如下:基准测试(特别是 Time…...
element ui 走马灯一页展示多个数据实现
element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作,先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…...
40分钟学 Go 语言高并发:Goroutine基础与原理
Day 03 - goroutine基础与原理 1. goroutine创建和调度 1.1 goroutine基本特性 特性说明轻量级初始栈大小仅2KB,可动态增长调度方式协作式调度,由Go运行时管理创建成本创建成本很低,可同时运行数十万个通信方式通过channel进行通信&#x…...
Figma插件指南:12款提升设计生产力的插件
在当今的设计领域,Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展,这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件,帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…...
【K8S系列】Kubernetes集群资源管理与调度 深度分析
在现代微服务架构中,Kubernetes(K8s)作为容器编排平台,提供了强大的资源管理和调度能力。然而,随着应用规模的扩大和复杂性增加,如何高效地管理和调度集群资源成为一个关键挑战。本文将深入探讨 Kubernetes…...
delphi fmx android 离线人脸识别
搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…...
Linux mountpoint 命令详解
前言 在 Linux 系统中,文件系统管理是一个非常重要的任务。mountpoint 是一个常用的小工具,用于检查目录是否是挂载点。本篇博客将详细介绍 mountpoint 命令的用法及其在日常系统管理中的应用。 什么是挂载点? 挂载点是一个目录࿰…...
Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验
在前面章节,我们有过使用寄存器去编写字符设备的经历了。这种直接在驱动代码中, 通过寄存器映射来对外设进行使用的编程方式,从驱动开发者的角度可以说是灾难。 因为每当芯片的寄存器发生了改动,那么底层的驱动几乎得重写。 那么…...
用sqlmap工具打sqli-labs前20关靶场
这个星期我们用手动注入打了前20关靶场,今天我们用sqlmap直接梭哈前20关 1.介绍sqlmap sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞。 2.下载和使用sqlmap 官方下载地址:GitHub - sq…...
代码随想录算法训练营第二十一天 | 93.复原IP地址 | 78.子集
Day 20 总结 自己实现中遇到哪些困难 一句话讲明白问题分类 组合问题和分割问题都是收集树的叶子节点,子集问题是找树的所有节点!切割字符串问题回顾 昨天的切割回文子串,和今天的切割ip地址,都是需要将字符串拆分成 n 份。只不过…...
#Uniapp篇:支持纯血鸿蒙发布适配UIUI
uni-ui梳理 组件生命周期 https://uniapp.dcloud.net.cn/tutorial/page.html#componentlifecycle 页面生命周期 https://uniapp.dcloud.net.cn/collocation/App.html#applifecycle onLaunch 当uni-app 初始化完成时触发(全局只触发一次),…...
边缘提取函数 [OPENCV--2]
OPENCV中最常用的边界检测是CANNY函数 下面展示它的用法 通常输入一个灰度图像(边界一般和颜色无关)这样也可以简化运算cv::Canny(inmat , outmat , therhold1, therhold2 ) 第一个参数是输入的灰度图像,第二个是输出的图像这两个参数都是引用…...
插值原理(数值计算方法)
插值原理(数值计算方法) 一. 原理介绍二. 图例三. 唯一性表述 一. 原理介绍 在数学中,插值(Interpolation)是指通过已知的离散数据点,构造一个连续的函数,该函数能够精确地通过这些数据点&#…...
【Pikachu】SSRF(Server-Side Request Forgery)服务器端请求伪造实战
尽人事以听天命 1.Server-Side Request Forgery服务器端请求伪造学习 SSRF(服务器端请求伪造)攻击的详细解析与防范 SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种安全漏洞,它允许攻击者通…...
IDEA怎么定位java类所用maven依赖版本及引用位置
在实际开发中,我们可能会遇到需要搞清楚代码所用依赖版本号及引用位置的场景,便于排查问题,怎么通过IDEA实现呢? 可以在IDEA中打开项目,右键点击maven的pom.xml文件,或者在maven窗口下选中项目,…...
Discuz论坛网站管理员的默认用户名admin怎么修改啊?
当我们在某个论坛注册账号后,处于某种原因想要修改用户名,该如何修改? Discuz论坛网站管理员处于安全性或某种原因想要修改默认用户名admin该如何修改?驰网飞飞和你分享 其实非常简单,但是普通用户没有修改权限&…...
微商城网站建设好么/推客平台
CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tc…...
网站建设就找奇思网络/互联网营销方案
访问者模式(visitor)表示一个作用于某对象结构中的各元素的操作。它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作。 这用于某个对象结构中的元素数目比较固定(基本不会变动),而对于这些元素的操作可能要变化&am…...
昆山自适应网站建设/百度下载安装2019
自学是一件很有趣的事,一旦和某种有目的性的行为挂钩,估计趣味就会降低很多。自从开始学习java的时候,就决定一如既往的走下去,不离不弃。 虽然,Sun已经离开了很久,但是java爱好者开发者依然激情饱满&#…...
佛山网站建设推广/媒体宣传推广方案
大学一毕业进入职场,职场跟学校是不一样的,你不去问问题什么的,或者请教别人也不会告诉你,问多了别人还会烦躁,甚至还会觉得你没有能力,但是别人告诉你也是留一手,怕你学会抢他饭碗。牵引力教育…...
专门做产品推广ppt的网站/鹤壁seo
2014年初,4G联网首次进入汽车前装市场,同一年,通讯及手机芯片厂商高通公司首次推出骁龙602A处理器,开启汽车联网信息娱乐服务新纪元。 两年后,高通发布了全新的信息娱乐系统处理器骁龙820A,和骁龙602A相比…...
响应式网站缺点/电商平台的推广及运营思路
2019独角兽企业重金招聘Python工程师标准>>> 第1部分:说明 最近在做一个类似微信语音聊天的功能,在屏幕的底部放一个Button,按下时可以语音说话,松开时将语音发出去。但是做的过程中遇到一个坑:按钮放到页面…...