Go项目结构、包管理及编译相关

前言

Go是Google大力推广的一门新兴语言,关于Go的优点,网络上有很多介绍,由于我个人也没有理解的很透彻,所以就不赘述了。之所以接触Go,是因为以太坊的相关代码是用Go来编写的。虽然也有其他的第三方实现,但是为了和官方保持一致,还是选择了Go来处理以太坊相关的区块链业务。

项目结构

由于以前大部分时间都是在写Java,所以比较习惯Java的项目结构。理所当然的按照Java的项目结构来管理Go。具体结构如下

1
2
3
4
Proj
--src
--bin
--pkg

这样的结构也可以正常管理Go的项目,只要把Proj路径设置为GOPath即可。但是不算是Go推荐的项目结构。尤其是使用Glide或者GoDep等包管理工具,或者将自身项目作为一个包提供给第三方使用的时候。比较推荐的做法是用如下结构管理

1
2
3
4
5
6
7
GOPATH
--bin
--pkg
--src
--Proj
--codede.lock
--vendor

包管理

Go可以通过 go get 获取第三方包到工程中,然后使用。但是对于第三方的包,并没有版本控制。所以Go的官方包管理十分鸡肋。再这样的情况下,出现了很多第三方的工具,其中以Glide和GoDep最为常用。接下来我们介绍Glide的使用。

  1. 按照前边推荐的格式,重新组织项目代码结构
  2. 安装Glide到本机,具体使用方法参见Glide GitHub
  3. 在Proj 目录下运行 glide init 命令,glide会自动分析出项目所使用的第三方包,生成两个文件在Proj目录下:glide.yaml glide.lock3. za在Project 目录下运行 glide init 命令,管理的glide会自动分析出项目所是使用使用的第三方包,生成两个文件在Project目录下:glide.yaml glide.lock。 其中glide.yaml 列出了所有引用的第三方包,glide.lock则锁定了第三方包的指定git提交。
  4. 运行 glide install 会将glide.yaml中所有的第三方包下载到vendor目录下。

以上为Glide的简单应用,其他相关使用可以在Glide的GitHub中查看。

Makefile

对于Go项目的编译,比较推荐使用Makefile来进行。方便进行整个任务的编排,需要注意Makefile只能使用Tab来进行缩进,有些编译器会自动将Tab转换为四个空格,所以编辑时一定要小心。

  • clean 正式编译前一般会进行一个clean操作,保证此次编译不受以往历史编译的影响。
1
2
clean:
rm -rf bin pkg
  • format Go自身提供了fmt命令,保证代码格式的一致性,所以在编译前,运行一遍,保证格式的规范,注意要忽略vendor中的第三方库代码
1
2
3
4
fmt:
go fmt `go list ./... | grep -v /vendor/`
安装了glide的话,也可以运行如下命令
go fmt `glide nv`
  • 编译运行文件, 其中: 后边的命令,表示此命令执行的前置条件
1
2
3
4
build: clean fmt
go install ${PKG_NAME}/main //在GOBIN目录下生成了一个名为main的程序
如果想要自己命名输出的程序,可以使用如下命令
go build -o new_name ${PKG_NAME}/main //在GOBIN目录下生成了一个名为new_name的程序
  • 交叉编译。如果我们自己的机器是Mac,但是服务器的环境是Linux 64,那么我们就可以使用交叉编译来生成指定平台的可执行文件,示例如下
1
2
server:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install ${PKG_NAME}/main

以上就是我对Go项目的结构、包管理等问题的一些个人经历,如果能帮助到大家,不胜荣幸。