在 Go 语言开发中,我们希望能够规范代码风格,每个成员在提交时可以一键格式化,同时检查是否有语法错误;我们希望能够一键运行单测,生成单测报告;我们希望能够一键编译、打包、发布项目,这就需要使用到
Make
。Make 有很多种,我们常用的就是
GUN Make
,有了 Make,我们将极大的提高项目开发、测试、发布的效率。
Make 最初是为 C、C++项目的编译、构建服务的,因此有很多为C、C++的特性,但是这些特性在 Go 开发中使用不到。毕竟每个人的时间有限,我们就只学习Go 开发中 Make 使用所必需的知识。
Make 的规则都在 Makefile 文件编写上,本篇文章,我们来学习 Makefile 命令和变量相关知识。
make 命令在 Windows 下不支持运行,需要在 Linux 或 Mac 环境下运行
运行 target 时,执行命令的同时,默认会输出命令到控制台
.PHONY: echo_test
echo_test:
echo "hello"
echo "world"
在我们执行命令时,有可能命令会出错,影响后续命令的执行。对于有些错误,我们可以忽略,让命令继续执行下去。比如我们想新建个文件夹,如果文件夹本来就存在,新建就会出错,但我们需要的就是文件夹存在,这种错误可以忽略。
当前目录 test 文件夹不存在,新建文件夹和文件,并显示文件列表
exec:
@mkdir test; cd test; touch a.txt; ls
第一次运行正常
➜ make exec
a.txt
第二次运行就会提示错误,但是同一行的命令会继续执行下去
➜ make exec
mkdir: test: File exists
a.txt
如果存在多行命令的话,前面一行的命令报错,后面的命令就不会继续执行了
exec:
@mkdir test
@echo "hello world"
定义命令模板
有时候可能有一些常用的功能,我们可以将其抽出来做成一个模板,供其他command 调用。定义模板的语法为:define
,接模板的名字;中间是命令,最后以 endef
结尾。
define template-name
...commands...
endef
使用命令模板,就像使用普通变量一样:
define my_template
@echo "this is a template"
endef
.PHONY: test
test:
$(my_template)
变量的声明和使用
和其他编程语言一样,Makefile 也可以定义变量,在 target、prerequisites、command中都可以使用。变量名由字母、数字和下划线组成(可以是数字开头),大小写敏感。
定义变量时,变量名 和 值 之间使用 “=” 连接,"=" 两侧空格不敏感;使用变量时,可以使用 $+变量名
的形式,更推荐的方式还是使用 $(变量名)
将变量包裹起来。
name= tom
age = 18
info:
echo $name
echo $(age)
在我们平常编程过程中,被引用的变量,一定要定义在前面,但是在 Makefile 中没有这个限制,你可以引用后面定义的变量(也可以理解为懒加载,只有用到时才会展开,此时整个文件已经都加载完了,因此不在乎使用的变量定义在前或者在后):
detail = $(name) $(age)
name = tom
age = 18
info:
@echo $(detail)