在Golang开发过程中,为了减少不断重复手动执行命令的操作,我们可以用makefile来实现“自动化编译”。它就像一个shell脚本一样,告诉机器如何编译。我们只需要一个make命令即可搞定编译的问题,极大的提高软件开发的效率。
工作方式
在默认方式下,我们只要输入make命令,那么make会在当前目录下寻找名字叫“Makefile”或“makefile”的文件,然后根据文件中的依赖关系,链接对应文件。它会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出。具体步骤如下:
- 读入所有的Makefile
- 读入被include的其他Makefile
- 初始化文件中的变量
- 推到隐晦规则,并分析所有规则
- 为所有的目标文件创建依赖关系链
- 根据依赖关系,决定哪些目标要重新生成
- 执行生成命令
下面展示一个简单的makefile示例,了解它们的语法规则以及学习如何在Golang项目中使用它们。
# Go parameters
VERSION=1.9.2
GOCMD=go
GORUN=$(GOCMD) run
run:
$(GORUN) main.go
第一句# Go parameters
是注释语句,在makefile文件中,只有单行注释,且都以“#”作为标志。
第二、三句是变量定义语句。变量名的规则是不能包括:: # = 前置空白和尾空白的任何字符
,它对大小写敏感。变量的引用和shell脚本类似,使用美元符号($)和圆括号。变量除了自定义变量之外(这也是经常用到的),也有系统预定义的。例如RM
表示删除命令,默认是rm -f
。
第四句就是命令语句:让其执行go run main.go
。make语句的执行顺序是按序执行,由于本文只是对Makefile的一个简单演示,所以命令语句很简单。但当你的项目比较复杂时,这时你可能执行多步命令才启动服务。例如用docker进行发布,就需要执行一系列docker操作。
下面是一个简单的项目,其中就包含了一个main.go文件、Makefile文件。
main.go
package beegoTest
import (
"chpkg.in/qiniu/log.v1"
)
func main() {
log.Info("hello world")
}
Makefile文件就是上文讲解中使用的代码,然后执行结果如下:
需要注意的是:Makefile文件的命令行首需要用tab键进分隔,不然程序是无法识别你的内容,从而会报如下错误:*** missing separator. Stop
。
参考文章: