Gomodule和GoPath

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 模块代理的,其作用直接通过镜像站点来快速拉取所需项目代码。

常见代理配置

执行命令:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值