Go module初探
go的依赖问题一直是老大难的问题,所以花点时间总结下,避免下次又花费太多的时间在这个上面。
一、Goland一直显示依赖为红色
1.11版本的go之后,大多推荐以go.mod进行包的管理,所以这里仅仅以go.mod为例进行解决。
第一步:go版本,必须是>= v1.11,本人使用的版本是1.15。
第二步:go env GO111MODULE以查看以否开启。
确保模式为on,设置方式为:
go env -w GO111MODULE=on
小知识:
没有GO111MODULE时,go编译程序的查找依赖的顺序gopath > goroot ,
有了GO111MODULE后,会读取当前项目的go.mod.文件,在go.mod文件
中会记录有哪些依赖。要使用go module 首先要设置GO111MODULE=on,
GO111MODULE 有三个值,off、on、auto,off 和 on 即关闭和开启,auto 则
会根据当前目录下是否有 go.mod 文件来判断是否使用 modules功能。无论
使用哪种模式,module功能默认不在GOPATH目录下查找依赖文件,所以使
用modules功能时请设置好代理。
第三步:配置代理
如果需要下载依赖包,需要配置代理。
代理二:https://athens.azurefd.net
代理三:https://mirrors.aliyun.com/goproxy/
Ping一下,选择一个速度快的进行代理配置。具体方法为:
go env -w GOPROXY=https://goproxy.io
也可以通过goland进行配置
第四步:下载依赖
go mod tidy
经过以上几步,解决中间的所有错误(如果遇到),应该就能将红色消灭。我在曾经在goland19.2上奋战很久,后来goland换成20.1后,依赖解决。所以打死我也用goland19.2.
小知识:
go module默认不在GOPATH目录下查找依赖文件,其首先会在GOPATH/pkg/mod中查 找有没有所需要的依赖,没有的直接会进行下载。
go mod down load下载好所需要的依赖,依赖默认会下载到GOPATH/pkg/mod中,其他项目也会使用缓存的module。
go get ./… 下载依赖包到GOPATH/pkg/mod
go mod tidy 依赖关系处理 ,根据go.mod文件,添加需要用到但go.mod中查不到的模块, 删除未使用的模块。也会下载包,所以有人说他是万能的。
go mod vendor指令,将依赖包从$GOPATH/pkg/mod目录拷贝至当前项目目录下的vendor目录
1.6版本的go查找依赖包路径如下:
当前包下的vendor目录。
向上级目录查找,直到找到src下的vendor目录。
在GOPATH下面查找依赖包。
在GOROOT目录下查找
二、自己刚建立的项目
1、对于刚建立的项目没有mod.go
go mod init
生成了mod.go
然后进行go run main.go进行包的下载和维护
三、go module管理
配置GOPATH可以方便找到软件源码,可以配置多个地址,比如:export GOPATH=/work1:/work2
一个标准的go的工程包含bin、pkg、src其中src是源码,bin和pkg不需要创建,在构建的过程中会自动创建这些目录。