Go语言学习指南:惯例模式与编程实践
上QQ阅读APP看书,第一时间看更新

1.6 Makefile

集成开发环境(IDE)虽然简单易用,但很难实现自动化。现代软件开发依赖于可重复的、可自动化的构建,以便任何人都可以随时随地运行。这就避免了开发者惯用的借口:“它在我的机器上能用!”为此,需要使用某种脚本来指定构建步骤。Go的开发者已经采用make作为他们的解决方案。你可能不熟悉make,但自1976年以来,它一直被用于在UNIX系统上构建程序。

这里有一个Makefile的示例,可以添加到我们的项目中:

即使你以前没有见过Makefile,也不难弄清楚它是怎么回事。每个可能的操作都被称为一个目标。.DEFAULT_GOAL定义了在没有指定目标时运行哪个目标。在这个示例中,我们要运行的是build目标。接下来就有了目标定义。冒号(:)前面的词是目标的名称。目标后面的任何词(比如build: vet一行中的vet)都是在指定的目标运行之前必须运行的其他目标。由目标执行的任务在目标之后的缩进行中。如果你在项目中创建了一个与目标同名的目录,.PHONY行可以防止make被混淆。

ch1目录下创建Makefile后,输入:

会看到以下输出:

通过输入单个命令,我们可以确保代码的格式正确,审查代码中的非明显错误,然后进行编译。我们还可以用make lint来运行linter,用make vet来审查代码,或者直接用make fmt来运行formatter(格式化程序)。这似乎不是什么大的改进,但是确保格式化和审查总是在开发者(或运行在持续集成构建服务器上的脚本)触发构建之前进行,这意味着项目参与者都遵循同一个构建流程和步骤。

Makefile非常“挑剔”,你必须用制表符缩进目标中的步骤。它们在Windows上也不支持开箱即用。如果在Windows计算机上进行Go开发,需要先安装make。最简单的方法是先安装软件包管理器Chocolatey(https://chocolatey.org),然后用它来安装make(对于Chocolatey,安装命令是choco install make)。