Golang开发中使用makefile

在Golang开发过程中,为了减少不断重复手动执行命令的操作,我们可以用makefile来实现“自动化编译”。它就像一个shell脚本一样,告诉机器如何编译。我们只需要一个make命令即可搞定编译的问题,极大的提高软件开发的效率。

工作方式

在默认方式下,我们只要输入make命令,那么make会在当前目录下寻找名字叫“Makefile”或“makefile”的文件,然后根据文件中的依赖关系,链接对应文件。它会一层又一层的去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出。具体步骤如下:

  1. 读入所有的Makefile
  2. 读入被include的其他Makefile
  3. 初始化文件中的变量
  4. 推到隐晦规则,并分析所有规则
  5. 为所有的目标文件创建依赖关系链
  6. 根据依赖关系,决定哪些目标要重新生成
  7. 执行生成命令

下面展示一个简单的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

参考文章:

  1. (Linux)详解Makefile变量
  2. Golang: Don’t afraid of makefiles
  3. GNU Make

猜你喜欢

转载自blog.csdn.net/benben_2015/article/details/80039704