使用Makefile构建指令集make是一个历史悠久的构建工具。通过配置Makefile文件,可以很方便的使用自己定制的指令集,与具体的编程语言无关。例如配置如下Makefile:rundev:NODE_ENV=developmentnodemonserver.js这样当你在命令行执行makerundev时,就会真正执行命令NODE_ENV=developmentnodemonserver.js。使用Makefile构建指令集可以大大提高工作效率。Makefile基本语法:target其实就是执行的目标,representations是执行这条命令的前提条件,commands是命令的具体内容。例子:build:cleangobuild-omyappmain.goclean:rm-rfmyapp这里的build有个前置条件clean,也就是说当你执行makebuild的时候,会先执行clean的命令内容,再执行rm-rfmyapp然后执行buildgobuild-omyappmain.go的内容。变量自定义变量,例子:APP=myappbuild:cleangobuild-o${APP}main.goclean:rm-rf${APP}PHONY上面的例子中定义了target。target有build和clean,如果当前目录恰好有一个名为build或clean的文件,则不会执行其指令内容,因为make会把target当作一个文件,只有当文件不存在或更改。为了解决这个问题,我们需要使用PHONY来声明target实际上是一个伪目标:APP=myapp.PHONY:buildbuild:cleangobuild-o${APP}main.go.PHONY:cleanclean:rm-rf${APP}也可以一行声明多个PHONY:.PHONY:buildcleanrecursivegoal假设我们的工程目录结构如下:~/project├──main.go├──Makefile└──mymodule/├──main.go└──Makefile文件根目录下还有一个文件夹mymodule,可能是一个单独的模块,同样需要打包构建,定义了自己的Makefile:#~/project/mymodule/MakefileAPP=modulebuild:gobuild-o${APP}main.go现在在项目的根目录下,如何执行mymodule子目录下定义的Makefile呢?使用cd命令也是可能的,但我们有另一种方法来解决这个问题:使用-C标志和特殊的${MAKE}变量。修改项目根目录下的Makefile为:APP=myapp.PHONY:buildbuild:cleangobuild-o${APP}main.go.PHONY:cleanclean:rm-rf${APP}.PHONY:build-mymodulebuild-mymodule:${MAKE}-Cmymodulebuild这样,当你执行makebuild-mymodule时,会自动切换到mymodule目录,执行mymodule目录下的Makefile中定义的build命令。Shell输出作为变量我们可以将shell中执行命令的输出作为变量:V=$(shellgoversion)gv:echo${V}这里执行makegv会先执行goversion命令,然后赋值输出内容到变量V。判断语句假设我们的指令依赖于环境变量ENV。我们可以使用前置条件检查是否忘记输入ENV:.PHONY:runrun:check-envecho${ENV}check-env:ifndefENV$(errorENVnotset,allowedvalues-`staging`or`production`)endif这里我们执行makerun的时候,因为有一个前置条件check-env会先执行前置条件中的内容,指令的内容是一个判断语句,判断ENV是否是undefined,如果是undefined,会抛出错误,错误信息为错误后的内容。帮助提示添加帮助帮助提示:.PHONY:build##build:buildtheapplicationbuild:clean@echo"Building..."@gobuild-o${APP}main.go.PHONY:run##run:runsgorunmain.gorun:gorun-racemain.go.PHONY:clean##clean:清理二进制clean:@echo"Cleaning"@rm-rf${APP}.PHONY:setup##setup:setupgomodulesup:@gomodinit\&&gomodtidy\&&gomodvendor.PHONY:help##help:打印这条帮助消息help:@echo"Usage:\n"@sed-n's/^##//p'${MAKEFILE_LIST}|列-t-s':'|sed-e's/^//'这样当你执行makehelp时,会打印出如下提示:消息/02/make.htmlhttps://www.gnu.org/software/make/manual/make.html