以下基于InfluxDBv1.7.4源码编译
第一步:安装git。 教程太多,自行Google
第二步:安装Go语言package。
1.下载地址:https://golang.org/dl/ (此地址需要翻墙)
2.备选地址:https://golang.google.cn/dl/ (不用翻墙也能访问)
3.本次教程下载的是Linux amd64位 go1.11.5版本。
4.配置环境go变量:本次需要配置的环境变量有两个GOROOT和GOPATH。(这两个环境变量的名字应该是go语言环境变量的专有名词,建议就按这样命名)
(1) GOROOT是go的安装目录,一般都是放在 /usr/local/目录下。我们在下载go安装包的目录下使用命令 “tar -zxvf go1.11.5.linux-amd64.tar.gz -C /usr/local/” 将go语言安装包解压缩至/usr/local目录下。我的解压缩之后如下图。解压缩之后,会在“/usr/local”多一个go文件夹。进入go文件夹以后,可以查看有以下这些目录。
其中src,bin和pkg是Go语言项目中比较重要的三个文件夹。其中src存放go项目的源码,bin存放源码编译之后的可执行文件,pkg存放源码编译之后的一些包。
(2)GOPATH是Go工程项目路径。我设置的路径是/home/jyx/gocodez(默认是/home/jyx/go)。如果执行go get指令获取项目的话。会自动创建gocodez/文件夹(如果不设置的话,则默认是go/文件夹)。以及会在该目录下创建src/和bin/文件夹。
(3)在当前用户的根目录下修改环境变量配置文件.bashrc。在最后文件末尾添加代码如下图所示
(4)运行 go version查看当前go版本。如下图所示则安装成功。
第三步:安装dep。可以将dep通俗的理解为go语言的依赖管理工具,类似于python中的pip,java中的Maven以及node.js中的npm工具。
我们通过 “go get github.com/golang/dep/cmd/dep” 命令来安装dep。安装成功之后,应该会在$GOPATH/bin下面有一个dep的可执行文件。同时在$GOPATH/src下面会有一个github.com/golang/dep/cmd/dep的文件夹。因为go get命令在下载包之后,会自动将它编译好的可执行程序放在bin/目录下,如不需要自动编译,可以加参数进行控制。如下图所示
确保在执行go get命令之前已经安装好git。因为go get的实质还是利用git去拉取源代码文件。实际上等同于git clone + go install两个命令。
注:go get会自动下载当前源代码或者软件包的最新版本。下载指定版本的正确操作还没找到。
第四步:在github官网下载InfluxDBv1.7.4,然后解压缩,重命名为influxdb,移动或者复制至$GOPATH/src/github.com/influxdata/目录下。
第五步:进入到$GOPATH/src/github.com/influxdata/目录下,执行go grt ./...,报错如下
主要缺以下几个包:
github.com/influxdata/flux/functions/inputs
github.com/influxdata/flux/functions/outputs
github.com/influxdata/flux/functions/transformations
github.com/influxdata/flux/options
github.com/influxdata/flux/functions
错误原因,因为最新的flux源码里没有functions这个文件夹,所以不行。我们得下一个有这个文件夹的版本,然后替换现在的flux文件夹。
故解决上述5个包的方法为:
执行以下命令:
git clone -b 0.11.0 https://github.com/influxdata/flux.git
下载一个有functions文件的旧版本再替换最新版本的flux,也即删除GOPATH/src/github.com/influxdata/目录下的flux文件夹,再将新的flux文件夹拷贝过去。
golang.org/x/sys/unix
golang.org/x/crypto/bcrypt
golang.org/x/crypto/ssh/terminal
golang.org/x/time/rate
golang.org/x/sync/errgroup
golang.org/x/net/context
golang.org/x/text/encoding/unicode
golang.org/x/text/transform
上述几个包,错误原因相同,都是被墙了。因为www.golang.org无法访问。我们可以去github下载对应的package。
分别执行以下命令:
go get github.com/golang/sys
go get github.com/golang/crypto
go get github.com/golang/time
go get github.com/golang/sync
go get github.com/golang/net
go get github.com/golang/text
执行go get命令,将在$GOPATH/src/下面自动创建 github.com/golang/*这样的文件夹。
下载对应的包,然后将$GOPATH/src/github.com/golang下面的sys、crypto、time、sync、net、text这些文件夹拷贝或者移动至$GOPATH/src/golang.org/x(golang.org/x这个文件夹路径需要手动创建)。
下图是下载并复制之后的结果
google.golang.org/grpc
google.golang.org/grpc/metadata
上面两个包,错误原因也是被墙。www.google.golang.org无法访问。我们也可以去github下载对应的package。
执行以下命令:
go get github.com/grpc/grpc-go
下载grpc-go包,然后将$GOPATH/src/github.com/grpc/目录下的grpc-go文件夹其移动至$GOPATH/src/google.golang.org/(google.golang.org文件夹也需要手工创建)文件夹下,并重命名为grpc。
第六步:再次进入到$GOPATH/src/github.com/influxdata/目录下,执行go grt ./...。
此次go get 过程大约持续了5-6分钟吧。发现还是有包被墙了。。。
主要缺少以下包:
google.golang.org/genproto/googleapis/rpc/status
golang.org/x/oauth2
golang.org/x/oauth2/github
golang.org/x/oauth2/heroku
google.golang.org/api/oauth2/v2
分别执行以下命令,获取对应的包,其中google.golang.org/api/oauth2/v2中的api的地址迁移到 googleapis组织的google-api-go-client项目中去了。
go get github.com/google/go-genproto
将$GOPATH/src/github.com/google/目录下的go-genproto文件夹复制或者移动到$GOPATH/src/google.golang.org/文件夹下,并重命名为 genproto。
go get github.com/golang/oauth2
将$GOPATH/src/github.com/golang目录下的oauth2文件夹复制或者移动到$GOPATH/src/golang.org/x/文件夹下。
go get github.com/googleapis/google-api-go-client
将$GOPATH/src/github.com/googleapis/目录下的google-api-go-client文件夹复制或者移动至$GOPATH/src/google.golang.org/文件夹下,并重命名为api。
第七步:再次进入到$GOPATH/src/github.com/influxdata/目录下,执行go grt ./...。
缺少以下包:
golang.org/x/exp/rand
执行以下命令:
go get github.com/golang/exp
将$GOPATH/src/github.com/golang目录下的exp文件夹复制或者移动到$GOPATH/src/golang.org/x/文件夹下。
第八步:再次进入到$GOPATH/src/github.com/influxdata/目录下,执行go grt ./...。
这次。。。终于成功了吧。
执行完上述命令之后,我们可以在$GOPATH/bin目录下发现如下信息
下图是服务端启动日志。
下图是客户端启动界面。
至此,InfluxDB源码的编译工作告一段落。
总结:此次编译Go语言项目InfluxDB源码的难点在于
1.需要了解Go语言项目的项目结构。前面所说的/src、/bin、/pkg等,以及两个环境变量。
2.使用dep包管理工具时,遇到被墙的一些包。前面已经给出解决办法,就是手工从github,com下载,再移动或复制到相应文件夹下。
3.go get命令下载的是最新的代码。要避免这种情况,就需要手工下载指定版本的源代码。然后移动到对应文件夹下。
4.需要理解控制台报错信息,并去github搜索对应的包,(有的包下载下来还需要更改文件夹名字才能确保其他包能导入),然后放到对应的文件夹下。
仍然存在的问题:虽然编译后的influxdb可以用,但是在最后一次 go get ./…的时候,还是报出了一些异常,主要是有些函数undefined,这个可能是因为一些包的版本不一致,这个可能导致InfluxDB无法正常使用,有待后续调查。