go的项目现在基本全是go module模式,快捷方便的包依赖和版本管理,但有时候碰到一些老项目需要维护,依然是go path模式,这种古老的模式对一些新学者可能一知半解就直接选择了go module,对老学者可能早已被遗忘,由此记录一下。
GOROOT=C:/go
1、goroot/src下是go本身的包。
2、go mod模式下,gopath/pkg/mod/找不到的包也会从root/src路径查找
3、go path模式下,gopath/src/里面不存在的包也会从root/src路径查找
GOPATH=E:/go
1、无论go mod 还是gopath模式,此目录需有。
2、若是go mod模式,第三方依赖包会在此目录下./pkg/mod下,如下图:
3、若是go path模式,第三方依赖包会在此目录下./src下,如下图:
go mod的代码可以随意安放,这是相对gopath一个方便的地方,无论项目代码放在哪里,依赖的包都如上所说,都在gopath/pkg/mod下,是绝对路径包含。
但go path的一般说法,gopath的项目代码,需要放在gopath/src目录下,它是对gopth/src的相对包含,这里会引出一个问题,如果我有两个项目,都有lib的包,如果代码都丢在gopath/src目录下,代码不是混在一起了吗?
显然解决方法是有的,如下,我想把项目放在随便一个目录E:/marketwork下,终端执行git clone xxxx src,将git代码clone下来到该目录的src目录下(src不用手动创建)
完了会发现本地包含的包有问题,因为都从全局的gopath/src去包含了,而你的代码不在gopath/src下。
如何解决?以golang为例,设置项目的go path即可,如下图:
设置好后,本地包含问题已解决,项目本身包含已经是绿色,重新打开ide的terminal,run一下发现第三方github的依赖包有问题
这个时候,如果你直接在该终端下执行go get github.com/xxxxxxx,会发现包下载在当前目录下了,这会有什么问题呢?对本项目是没有问题的,因为上面图看出,设置了项目的gopath,它在全局的gopath和goroot找不到的包,最终还会到项目的gopath去找这个包。
但这样会造成包文件的重复冗余,因为github上的包,很多项目本来可能是共用的,每个项目自己目录下一份没必要。而且下到全局的gopath/src下,以后别的项目用到,就直接能查找到,就不会再下载了,那如何把github上的包下到全局的gopath/src呢?
其实很简单,另外开一个终端,将当前终端的gopath环境变更设置为只有全局的,再go get xxxx,就是下载到全局的gopath/src下,所以在gopath模式下,go get 下载的包在什么目录,取决于当前终端设置的go环境变量GOPATH的目录是什么。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。