再谈go mod

在很早以前开始学习go的时候,我推荐给了一个朋友,我那朋友对我说:“go连个包管理都没有,到它有包管理的时候再来学”,确实,go的包管理一直受到众多人诟病的地方之一。

所以在开始的时候,出现了很多第三方针对go的包管理器,因为都不是官方的,受制于go语言本身的制约(go get等),这些包管理器都存在这个那个不足,很混乱,go vendor 和 govendor 不一样的,一个是官方的前版本,一个是第三方的补充版本,弄得很晕。

备注:查看go的环境变量,用 go env 命令。

直到go的1.11版本,官方才出了个正式的go mod(也就是go module),在使用go mod的时候,这个go环境变量非常重要:GO111MODULE,这个变量有3个取值:
on:表示所有go的工程一律采用go mod方式来管理包。
off:表示所有go的工程一律不采用go mod方式来管理包,如此还是用以前的方式。
auto:默认是这个,为空也是这个,那么假如工程中有go.mod这个文件,那么采用go mod方式,否则采用以前的方式。

在不采用 go mod 方式的时候,用 go get 下载包的时候,是下载到 $GOPATH/src 下面。
在采用go mod方式的时候,用 go get 下载包的时候,是下载到 $GOPATH/pkg/mod 下面。

我们知道,在用 go get 下载包的时候,特别慢,为了解决这个问题:
在不采用 go mod 方式的时候,用 go get 下载包,则需要自己解决代理的问题,很麻烦。
在采用go mod方式的时候,用 go get 下载包,则可以有众多的免费代理供我们选择(注意,凡是这样的代理,都是在go mod模式下面,传统的不行),我们常用 https://goproxy.cn/ 来进行代理,设置如下:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

或者设置linux的环境变量也是可以的:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn

在用 go mod 方式来管理包的时候,在工程中会遇到2个问题:
1,本地的包如何导入:这个问题大家在开发的时候肯定会遇到,在用传统模式的时候,根本不会有问题的,但是到了 go mod 下,就遇到本地的包没有办法导入,这篇文章写得太好了,大家可以去看:如何使用go module导入本地包
2,私有库的包如何导入:我们常常会用gitlab搭建我们的私有git库,搭建gitlab的时候,往往有一些不同于正规github的设定,比如用http协议没有用https协议,比如不支持ssh协议,如此在解决go mod的时候,网上的很多关于golang的gitlab支持文章都失效,我个人认为解决办法就是clone下来吧,放在$GOPATH/src下面吧,没有其他好的办法。

发表评论

邮箱地址不会被公开。 必填项已用*标注