Gomodule和GoPath

news2024/11/18 14:42:39

GoLang生态系统

什么是GOROOT

GOROOT 是环境变量,它的值是 Golang 安装包路径

什么是GOPATH

GOPATH 是Golang 1.5版本之前一个重要的环境变量配置,是存放 Golang 项目代码的文件路径。

可以通过go env命令查看

image-20221130104347515

GOPATH目录

进入GOPATH目录,查看该目录下的所有文件。

go
├── bin
├── pkg
└── src
    ├── github.com
    ├── golang.org
    ├── google.golang.org
    ....

可以看到有三个文件夹。

  • bin 存放编译生成的二进制文件。比如 执行命令 go get github.com/google/gops,bin目录会生成 gops 的二进制文件。

  • pkg 其中pkg下面以下三个文件夹。

    • ​ XX_amd64: 其中 XX 是目标操作系统,比如 mac 系统对应的是darwin_amd64, linux 系统对应的是 linux_amd64,存放的是.a结尾的文件。
    • ​ mod: 当开启go Modules 模式下,go get命令缓存下依赖包存放的位置
    • ​ sumdb: go get命令缓存下载的checksum数据存放的位置

image-20221130110609452

GOPATH缺点

  • go get 命令的时候,无法指定获取的版本

  • 引用第三方项目的时候,无法处理v1、v2、v3等不同版本的引用问题,因为在GOPATH 模式下项目路径都是 github.com/foo/project

  • 无法同步一致第三方版本号,在运行 Go 应用程序的时候,无法保证其它人与所期望依赖的第三方库是相同的版本。

变量名变量值
GOROOTC:\Program\Go(这里填写你的Golang安装目录)
GOPATHC:\Program\Go\WrokSpace(这里填写你的Golang工作目录,用于保存相应下载的包,例如go get -u github.com/go-sql-driver/mysql)

什么是GOMODULE

gomodule诞生是为了实现存放项目路径自由和不同版本的管理。

image-20221130105929563

GO111MODULE的行为

在go 1.11 官方出手了推出了 Go Modules, 通过设置环境变量 GO111MODULE 进行开启或者关闭 go mod 模式。

  • auto 自动模式,当项目根目录有 go.mod 文件,启用 Go modules
  • off 关闭 go mod 模式
  • on 开启go mod 模式

到目前为止,GO111MODULE为每个 Go 操作明确设置了环境变量。无变量集,缺省值GO111MODULEauto,它的行为如下:

image-20221130111019304

通过命令,关闭go module,切换到GOPATH模式

go env -w GO111MODULE=off

然后再执行go get命令,就会把源代码下载到GOPATH所在的目录下

go get -u github.com/jinzhu/gorm

image-20221130110358581

Go mod命令

命令作用
go mod init 工程名(一般和根文件夹的名字一样)生成 go.mod 文件,一个go mod工程一个go.mod文件, 并且一定要在工程的根目录
go mod download下载 go.mod 文件中指明的所有依赖
go mod tidy整理现有的依赖
go mod graph查看现有的依赖结构
go mod edit编辑 go.mod 文件
go mod vendor导出项目所有的依赖到vendor目录
go mod verify校验一个模块是否被篡改过
go mod why查看为什么需要依赖某模块

初始化Modules

新创建一个空目录test_mod,进入该目录,执行命令

//test_mod 为项目名称
go mod int test_mod

会在根目录生成一个 go.mod 文件,内容如下:

module test_mod

go 1.17

如果想引入第三方网络包,在该项目目录执行 go get 仓库地址。比如引入定时任务:

go get github.com/robfig/cron/v3

go.mod 会变成为, indirect 代表是间接依赖,因为当前项目是空的,所以并没有发现这个模块的明确引用。

module test_mod

go 1.17

require github.com/robfig/cron/v3 v3.0.1 // indirect

并且也会新增一个go.sum文件, 它的作用是保证项目所依赖的模块版本,不会被篡改。

github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=

注意此时,我们的项目是没有任何go代码文件的,现在只有 go.mod 和 go.sum 两个文件。

如果我们 go.mod 导入了第三方包,但项目代码中我不用,就是玩。领导发现后,不小心一个 go mod tidy 命令,直接把你回到解放前。

观察 go.mod 会发现已经没有了这串神秘代码

require github.com/robfig/cron/v3 v3.0.1 // indirect

机智的你,可能已经猜到了,go mod tidy 就是去掉go.mod文件中项目不需要的依赖。

image-20221130112059714

什么是GOPROXY

作为开发者基本上都会用到 github 上面的开源仓库,因网络问题,导致有些包是无法下载下来的。不过不用担心,太阳底下无新鲜事,已经现成的Go 镜像站点帮你获取。

环境变量 GOPROXY 就是设置 Go 模块代理的,其作用直接通过镜像站点来快速拉取所需项目代码。

常见代理配置

  • 阿里云

    https://mirrors.aliyun.com/goproxy/

  • 七牛云

    https://goproxy.cn,direct

执行命令:

go env -w GOPROXY="https://goproxy.cn,direct" 

SIV rules

Go MODULE引入了SIV来支持多个项目版本的依赖关系管理。它有三个规则:

(1) Golang项目应该遵循语义版本控制格式(Semver)。图2(a)给出了一个示例,其中projectA在GitHub上使用v2.7.0的语义版本标记了一个版本。

(2)当一个项目的主要版本是v2或以上版本(表示为v2+)时,必须在go.mod文件中声明的模块路径的末尾包含像“/v2”这样的版本后缀。如图2(b)所示,projectAv2.7.0的模块路径为“github.com/user/projectA/v2”。要引用它,下游项目必须声明此路径,并在go.mod文件的需要指令属性中,以及在其.go源文件的导入指令属性中导入它。图2©和(d)给出了两个例子。

(3)如果一个项目的主要版本是v0/v1,则其版本后缀不应该包含在其模块或导入路径中。 如果不写/v2 默认就是/v0或/v1。

image-20221130145629520

image-20221130145354397

在Go模块中的这些SIV规则下,一个库的多个主要版本可以被不同的路径单独引用。相比之下,GOPATH中的一个项目只能引用一个库的最新版本。

引用

https://blog.csdn.net/luosisan/article/details/124062564

https://blog.csdn.net/asdcls/article/details/121654725

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】redis分片集群搭建:3主3从,容错迁移,扩缩容

Docker是基于Go语言实现的云开源项目。Docker的主要目标是**“Build,Ship and Run Any App,Anywhere”**。也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运…

2022 ios APP最新iOS开发上架测试教程

2022 ios APP最新开发测试教程 本文详细介绍最新的在windows上进行ios app开发编译打包安装到手机测试的完整流程。介绍ios开发经常遇到的问题和解决方法,包括ios开发证书,ios开发描述文件等。 2.Apple开发常用的三个网址: 开发者中心&#x…

羚数智能入选 IDC关于中国制造执行系统(MES)的市场2021年度份额报告

近日,国际权威市场研究机构IDC发布《中国制造业 MES 市场分析及厂商份额,2021》,引起行业关注。 成立短短一年多,羚数智能作为国产生产运营管理软件年度代表企业(Vendor Who Shaped the Year)入选报告&…

LabVIEW比较LabVIEW类对象 LabVIEW接口

LabVIEW比较LabVIEW类对象 LabVIEW接口 使用比较功能比较LabVIEW类对象。 如比较同一个类的两个对象,例如,卡车类的两个对象,LabVIEW将比较类层次结构中所有层次的数据,类似于LabVIEW比较由簇组成的簇。 如比较不同类的两个对…

Coremail邮件安全:如何防范校园邮件新威胁

11月23日,Coremail举办《校园安全交流防护会暨新技术应用分享》直播,Coremail邮件安全解决方案专家刘骞,从目前面临的邮件安全防护难点、盗号威胁等角度提出针对教育行业的有效邮件安全解决方案。 教育行业面临邮件安全问题 问题1&#xff…

[附源码]Python计算机毕业设计Django健身房预约平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【软件测试】身为测试人,经常背锅的我该咋办?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 当产品上线的或者开…

Live800:智能客服时代,智能营销机器人有哪些套路?

流量已进入存量时代,大量企业为了活下去陷入竞争“内耗”。 面对更挑剔的客户需求、更精细的运营挑战,企业客户服务场景从幕后走向台前,脱离了传统的、被动的消费语境,成为完成客户体验闭环、主动触达客户、甚至成为驱动企业“第…

[附源码]Python计算机毕业设计SSM开放式实验室预约系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于无线通信模块对焦炉发讯装置的设计

现有的交换机控制系统多采用PLC控制系统,当焦炉出现故障,需要交换机停止加热时,需有人工进行干预时存在滞后性;以上操作需要操作人员具有良好的心理素质和过硬的技术能力,存在误操作的可能。当交换机本身及外部设备发生…

Lambda表达式

注:函数式接口和Lamda的区别 函数式接口:即只有一个抽象方法的接口,而这一个抽象方法的接口可以由Lamda表达式来实现。 1.Lambda表达式 1.1 省略规则 参数类型可以省略方法体只有一句代码时大括号和唯一一句代码的分号可以省略方法只有一…

Xilinx IOBUF 的用法

Xilinx IOBUF 的用法 文章目录Xilinx IOBUF 的用法一、概念1. 基本概念2. 硬件结构2.1 IOBUF2.2 OBUFT二、实例三、参考文献一、概念 1. 基本概念 **应用场景:**在vivado中,连接的管脚的信号一般都会自动添加OBUF或IBUF。但是对于inout类型的接口&#…

腾讯云发布智慧员工管理方案,支持组织360度协作

提升组织活力和协作效率是企业打造自身竞争力的关键因素。12月1日,腾讯云发布智慧员工管理方案,融合腾讯电子签、腾讯乐享、腾讯微卡、腾讯云HiFlow、数据连接器等多款产品,打造高效、安全、共享、低碳的组织协同网络。 腾讯云副总裁答治茜表…

MyBatis-Plus配置之基础配置(SpringBoot)

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作&#x…

排序算法——选择排序、冒泡排序、插入排序 超易理解【JAVA】

一、什么是选择排序算法? 选择排序(Selection sort)是一种简单直观的排序算法。 选择排序是不稳定的排序方法。时间复杂度O(n2) 工作原理 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在…

redis安装(单机模式和哨兵模式)

单机模式(学习环境建议): 1.添加软件安装源 yum install epel-release 2.安装redis yum install redis -y 3.启动redis systemctl start redis 4.允许开机启动 systemctl enable redis 5.修改配置 vim /etc/redis.conf 6.bind改成…

我的期末网页设计HTML作品——咖啡文化网页制作

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

[附源码]计算机毕业设计智能家电商城Springboot程序

项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 Maven管理等等。 环境需要 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse…

深入浅出学习透析 Nginx 服务器的基本原理和配置指南「运维操作实战篇」

Nginx前提回顾 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: Web服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢…

python中利用随机数绘制曲线

使用python绘制数学函数图像很方便,在构造函数自变量取值时可以利用随机数生成模块,因本人工作需要,现将python中随机数的使用,以及二次函数图像绘制进行梳理总结 目录 1. python中的随机数产生 1.1 random模块 1.1 numpy.ran…