添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在 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)