话说胖虎最近招了一个实习生,实习生进来也有一段时间了,天天一个人坐在工位,很少跟周围的同事交流,也不知道有没有遇到什么问题。
胖虎决定主动出击,简单了解下实习生最近的学习情况,也关心一下工作是否顺利
胖虎:来了有几天了,我来验收一下学习的情况吧。先说说什么是 GOROOT 吧
实习生笑道:这个简单啊, 简直就是送分题啊,学长, GOROOT 是环境变量,它的值是 Golang 安装包路径
胖虎内心os:这又不是面试造火箭,肯定不会为难你啊。要是面试问这个问题,算我输。
胖虎:那 GOPATH 呢?
实习生:GOPATH 是Golang 1.5版本之前一个重要的环境变量配置,是存放 Golang 项目代码的文件路径。
实习生:在命令控制台输入
go env GOPATH
或者输入:
go env | grep GOPATH
进入GOPATH目录,查看该目录下的所有文件。
go
├── bin
├── pkg
└── src
├── github.com
├── golang.org
├── google.golang.org
....
可以看到有三个文件夹。
因此在使用 GOPATH 模式下,我们需要将应用代码存放在固定的$GOPATH/src目录下,并且如果执行go get来拉取外部依赖会自动下载并安装到$GOPATH目录下。
简单来说,GOPATH模式下,项目代码不能想放哪里就放哪里,哪怕你的学习资料盘满了也不行。
胖虎:除了需要指定目录,还有哪些缺点吗?
实习生:除了必须指定目录,还是以下三大罪状。
实习生:难道就没有解决办法了吗?我墙裂要求官方,实现存放项目路径自由和不同版本的管理。
胖虎:哈哈,不要着急啊,在go 1.11 官方出手了推出了 Go Modules, 通过设置环境变量 GO111MODULE 进行开启或者关闭 go mod 模式。
开启 go mod 模式后,你的项目代码想放哪里就放哪里,你想引用哪个版本就用哪个版本,你的地盘,你做主。妈妈再也不用担心你的F盘磁盘空间不够用了。
实习生:学长,我发现一个问题啊,那就是 github 上面有的包下载不下来,是怎么回事呢?
胖虎:作为开发者基本上都会用到 github 上面的开源仓库,因网络问题,导致有些包是无法下载下来的。不过不用担心,太阳底下无新鲜事,已经现成的Go 镜像站点帮你获取。
环境变量 GOPROXY 就是设置 Go 模块代理的,其作用直接通过镜像站点来快速拉取所需项目代码。
常见代理配置
执行命令:
go env -w GOPROXY="https://goproxy.cn,direct"
实习生:go mod 既然这么好,那应该怎么使用 go mod 呢?快教教我吧。
基于 go1.17.3 版本
胖虎: 咳咳,学长教学时间开始了,新创建一个空目录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文件中项目不需要的依赖。
实习生:如果引入的开源项目的源代码,别人删除了怎么办呢?
自己本地新开发项目代码,还没有推送到远程仓库,其他项目要引用怎么办?
胖虎:不要慌,学长有两个锦囊妙计供你使用,你可按照自己喜好按需使用。
执行命令:
go mod edit -replace [old git package]@[version]=[new git package]@[version]
例如:
go mod edit -replace github.com/bndr/gojenkins=github.com/Bpazy/gojenkins@latest
执行后 ,会发现 go.mod 文件最后有一串神秘代码
replace github.com/bndr/gojenkins => github.com/Bpazy/gojenkins v1.0.2-0.20200708084040-3655c428bba9
简单粗暴,直接修改go.mod文件,在go.mod文件最后添加以下神秘代码
replace github.com/bndr/gojenkins => github.com/Bpazy/gojenkins v1.0.2-0.20200708084040-3655c428bba9
即可完美解决此问题,replace 还有一个隐藏的秘密,那就是可引入本地项目代码
replace github.com/bndr/gojenkins => ../gojenkins
胖虎:最后问下你一个问题吧,go.mod 修改了,要提交到项目仓库,那 go.sum 文件要不要一起提交呢?如果不提交会产生什么后果?回答上来今天就让你提前下班。
实习生:……
有愿意帮实习生的大佬吗?
以上是今天跟大家分享的内容,如果这篇文章对你有帮助,辛苦帮忙点个赞,谢谢