GoLang生态系统
什么是GOROOT
GOROOT 是环境变量,它的值是 Golang 安装包路径
什么是GOPATH
GOPATH 是Golang 1.5版本之前一个重要的环境变量配置,是存放 Golang 项目代码的文件路径。
可以通过go env命令查看
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数据存放的位置
GOPATH缺点
-
go get 命令的时候,无法指定获取的版本
-
引用第三方项目的时候,无法处理v1、v2、v3等不同版本的引用问题,因为在GOPATH 模式下项目路径都是 github.com/foo/project
-
无法同步一致第三方版本号,在运行 Go 应用程序的时候,无法保证其它人与所期望依赖的第三方库是相同的版本。
变量名 | 变量值 |
---|---|
GOROOT | C:\Program\Go(这里填写你的Golang安装目录) |
GOPATH | C:\Program\Go\WrokSpace(这里填写你的Golang工作目录,用于保存相应下载的包,例如go get -u github.com/go-sql-driver/mysql) |
什么是GOMODULE
gomodule诞生是为了实现存放项目路径自由和不同版本的管理。
GO111MODULE的行为
在go 1.11 官方出手了推出了 Go Modules, 通过设置环境变量 GO111MODULE 进行开启或者关闭 go mod 模式。
- auto 自动模式,当项目根目录有 go.mod 文件,启用 Go modules
- off 关闭 go mod 模式
- on 开启go mod 模式
到目前为止,GO111MODULE
为每个 Go 操作明确设置了环境变量。无变量集,缺省值GO111MODULE
是auto
,它的行为如下:
通过命令,关闭go module,切换到GOPATH模式
go env -w GO111MODULE=off
然后再执行go get命令,就会把源代码下载到GOPATH所在的目录下
go get -u github.com/jinzhu/gorm
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文件中项目不需要的依赖。
什么是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。
在Go模块中的这些SIV规则下,一个库的多个主要版本可以被不同的路径单独引用。相比之下,GOPATH中的一个项目只能引用一个库的最新版本。
引用
https://blog.csdn.net/luosisan/article/details/124062564
https://blog.csdn.net/asdcls/article/details/121654725