依赖管理(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,只是版本不同。

  1. 使用,T v1.0
  2. 使用,T v2.0

    由于编译器固定依赖GOPATH / src 下查找GOPATH / src / T 这条路径,又因为无法在同一个GOPATH目录下储存T的两个版本。所以A、B无法共享同一个GOPATH,需要各自维护一个,带来极大的不便。针对GOPATH的缺点,Go语言社区提供了Vendor机制。从此依赖管理进入了第二阶段。

GOROOT 与 GOPATH 的主要区别

区别

GOROOT

GOPATH

定义

Go 安装目录

Go 工作区,存放用户项目和依赖

包含内容

标准库、编译器、工具等

用户源码、依赖包缓存、可执行文件等

是否可修改

一般不需要修改,由 Go 自动设置

用户可以设置为任意路径

使用场景

Go 标准库查找、工具链使用

非模块化项目存储、编译生成文件

总结

  1.  指向 Go 安装目录,包含标准库和工具,不建议修改。
  2.  指向工作区目录,存放用户项目和依赖,是用户项目的主要工作目录。

 

二、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

总体来说:

  1. module 是 的模块化系统的概念,它定义了依赖管理的机制。
  2. 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,还是不错的。

希望大家有收获,期待下次再见。

 

 

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

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

相关文章

kali搭建pikachu靶场

前言&#xff1a; 总所周知搭个网站需要有apachemysqlphp&#xff0c;Apache是一个开源的Web服务器软件&#xff0c; MySQL是一种关系型数据库管理系统&#xff08;数据库&#xff09;&#xff0c;PHP是一种在服务器上执行的脚本语言 文章内容来自&#xff1a;【黑帽编程与攻…

C++时间复杂度与空间复杂度

一、时间复杂度&#xff08;Time Complexity&#xff09; 1. 概念 时间复杂度是用来衡量算法运行时间随着输入规模增长而增长的量级。它主要关注的是算法执行基本操作的次数与输入规模之间的关系&#xff0c;而非具体的运行时间&#xff08;因为实际运行时间会受硬件、编程语…

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素&#xff1a;机密性、完整性、可用性、可控性、审查性 信息安全范围&#xff1a;设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在&#xff1a;物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 &#xff08;一&#xff09;启用 TCP/IP 协议 操作入口 首先&#xff0c;我们要找到 SQL Server 配置管理器&#xff0c;操作路径为&#xff1a;通过 “此电脑” 右键选择 “管理”&#xff0c;在弹出的 “计算机管理” 窗口中&#xff0c;找到 “服务和应用程…

类和对象——static 成员,匿名对象(C++)

1.static成员 a&#xff09;⽤static修饰的成员变量&#xff0c;称之为静态成员变量&#xff0c;静态成员变量⼀定要在类外进行初始化。 b&#xff09;静态成员变量为所有类对象所共享&#xff0c;不属于某个具体的对象&#xff0c;不存在对象中&#xff0c;存放在静态区。 …

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …

【JavaEE初阶 — 多线程】线程池

目录 1. 线程池的原理 1.1 为什么要有线程池 1.2 线程池的构造方法 1.3 线程池的核心参数 1.4 TimeUnit 1.5 工作队列的类型 1.6 工厂设计模式 1.6.1 工厂模式概念 1.6.2 使用工厂模式的好处 1.6.3 使用工厂模式的典型案例 1.6.4 Thread…

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统&#xff0c;旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色&#xff1a;求职者、招聘者以及超级管理员&#xff0c;每个角色拥有独特的功能模块&#xff0c;确保用户能够轻松完成从信息获取到最终录用的整个…

黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)

前言&#xff1a; 在此之前找了好多资料&#xff0c;查了很多&#xff0c;都没有找到对应解决的方法&#xff0c;虽然知道是userid为空&#xff0c;但不知道要修改哪里&#xff0c;还是自己的debug能力不足&#xff0c;以后得多加练习。。。 问题如下&#xff1a; 点击限时抢…

使用GDB或Delve对已经运行起来的Go程序进行远程调试

同步发布在我的博客&#xff0c;欢迎来点赞。 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 使用 GDB 或 Delve 对已经运行起来的 Go 程序进行远程调试 背景 Java 程序可以很方便地通过 jdwp 参数指定一个对外端口进行远程调试&#xff0c;如 java \ -agentlib…

如何解决pdf.js跨域从url动态加载pdf文档

摘要 当我们想用PDF.js从URL加载文档时&#xff0c;将会因遇到跨域问题而中断&#xff0c;且是因为会触发了PDF.js和浏览器的双重CORS block&#xff0c;这篇文章将会介绍&#xff1a;①如何禁用pdf.js的跨域&#xff1f;②如何绕过浏览器的CORS加载URL文件&#xff1f;②如何使…

Jmeter中的断言(三)

9--MD5Hex断言 功能特点 数据完整性验证&#xff1a;验证响应数据的 MD5 哈希值是否符合预期。简单配置&#xff1a;只需提供预期的 MD5 哈希值即可。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测试需求。 配置步骤 添加 MD5Hex 断言 右键点击需要添加…

Tomcat和Nginx原理说明

Tomcat Tomcat 是一个开源的 Java 应用服务器&#xff0c;它由多个关键组件组成。这些组件共同协作&#xff0c;实现了 Servlet 容器的功能。以下是 Tomcat 的核心组件说明及其逻辑架构的示意图。 1. Tomcat 核心组件说明 (1) Server 描述&#xff1a;Tomcat 的顶级组件&…

vmWare虚拟环境centos7安装Hadoop 伪分布式实践

背景&#xff1a;近期在研发大数据中台&#xff0c;需要研究Hadoop hive 的各种特性&#xff0c;需要搭建一个Hadoop的虚拟环境&#xff0c;本来想着使用dock &#xff0c;但突然发现docker 公共仓库的镜像 被XX 了&#xff0c;无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…

10 基于深度学习的目标检测

首次完成时间&#xff1a;2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1&#xff09;程序代码&#xff1a; import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …

ssl证书,以 Nginx 为例

文章目录 1 证书概述1.1 常见证书格式1.2 证书的几种扩展名1.3 关于 PKCS#12 格式 2 Nginx 下证书配置2.1 证书的工作原理2.1.1 单向认证2.1.2 双向认证 2.2 CA 机构签发2.2.1 免费 SSL 证书申请2.2.2 双向认证 2.3 自签证书2.3.1 单向认证2.3.2 双向认证 附录 1&#xff1a;Wi…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

专家PID控制

专家PID控制&#xff08;Expert PID Control&#xff09;是一种结合了传统PID控制和专家系统思想的控制方法。它通过引入专家经验、规则和推理机制&#xff0c;以改善PID控制器在面对复杂系统时的性能。专家PID控制不仅仅依赖于固定的PID参数&#xff08;比例、积分、微分&…

ES分词环境实战

文章目录 安装下载1.1 下载镜像1.2 单节点启动 防火墙设置异常处理【1】iptable链路中断 参考文档 参加完2024年11月软考&#xff0c;对ES的分词进行考查&#xff0c;前期有【 Docker 环境下安装部署 Elasticsearch 和 kibana】和【 Docker 环境下为 Elasticsearch 安装IK 分…

【桌面应用程序】Vue-Electron 环境构建、打包与测试(Windows)

前言 Vue 与 Electron 环境构建、打包与测试。 目录 前言 一、基本环境准备 二、配置npm源 三、创建Vue项目 四、添加Electron支持 五、应用启动 ​六、添加UI框架 ElementUI ​七、打包 一、基本环境准备 npm版本&#xff1a;8.6.0node版本&#xff1a;v18.0.0Vue/…