Gomodule和GoPath
创始人
2024-04-16 00:47:34
0

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_modgo 1.17

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

go get github.com/robfig/cron/v3

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

module test_modgo 1.17require 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

相关内容

热门资讯

国家发展改革委:地方要建立消费... 中国青年报客户端北京12月31日电(中青报·中青网记者 贾骥业)2025年大众在享受消费品以旧换新政...
华润微:副总裁兼总法律顾问、首... 每经AI快讯,12月31日,华润微公告,公司董事会于近日收到高级管理人员李舸先生提交的书面辞职报告。...
真心办事 倾心解忧——长春南关... “真是太感谢法院工作人员了,不仅帮我们解决了业主的合理诉求,还让拖欠的物业费得到了妥善处理。”近日,...
山东省第四届“十佳调解案例”揭... 齐鲁晚报·齐鲁壹点记者 栾海明 实习生 李敏 12月30日,由山东省司法厅、齐鲁晚报·齐鲁壹点联合开...
河套合作区深圳园区条例拟于明年... 深圳商报·读创客户端记者 张钧政 12月26日,《深圳经济特区河套深港科技创新合作区深圳园区条例》(...
山东出台《医疗纠纷预防和处理办... 齐鲁晚报·齐鲁壹点 记者 温向前 近日,山东省人民政府正式公布《山东省医疗纠纷预防和处理办法》(以下...
超23亿元索赔案:新能源产业链... 【文/观察者网 潘昱辰 编辑/高莘】日前,吉利极氪旗下电池公司威睿以电芯存在质量问题为由,将电芯供应...