前几天的文章:每日一技能:为Python项目编写Makefile,我们讲到了Makefile。这几天有很多同学在公众号的后台留言,想学习更多Makefile的编写方法。于是,就有了今天的文章。如果你现在使用的是macOS或者Linux,可以在终端输入命令manmake查看make命令的帮助文档,如下图所示:有了make命令,可以快速运行一大段Shell命令实现一键编译代码,一键格式化代码等功能。要学习Makefile,你需要有一台Linux或者macOS,然后你需要知道两个概念:make命令和Makefile。其中Makefile文件是自己编写的文本文件。它的名字是Makefile,大小写不能改。而make是macOS和Linux自带的命令。当我们执行make命令时,它会自动读取Makefile来决定要做什么。让我们看一个实际的例子。下图是一段很简单的Golang代码:代码中,有些逗号后面没有跟空格,结构也写得参差不齐。当我们要格式化一个.go文件时,一般会在当前文件夹下执行命令:gofmt-wxxx.go运行后如下图所示:为了执行这个命令,需要敲键盘15次.而如果你的项目中有很多.go文件,而且它们位于不同的文件夹中,那么你还需要执行命令:find.-name"*.go"|xargsgofmt-w还有更多的键盘可以输入。这时候我们可以在项目的根目录下创建一个Makefile,其内容如下:fmt:find.-name"*.go"|xargsgofmt-w如下图所示:那么,当我们在项目根目录下执行命令:makefmt时,会自动格式化整个项目中的所有.go文件。Makefile文件格式如下:name1:shell命令1shell命令2shell命令3name2:shell命令4shell命令5shell命令6其中name1和name2用于执行命令makename,每个名称后面可以跟许多Shell命令。这里看起来有点像Python的缩进。但需要注意的是Makefile的缩进只能使用Tab键,不能使用空格。让我们再举一个例子。现在,我需要编译项目以生成可执行文件,然后将可执行文件与data.json一起复制到名为output的文件夹中。那么,我们的Makefile可以这样写:fmt:gofmt-w*.gobuild:rm-rfoutputmkdiroutputgobuild-oJsonReadermain.gomvJsonReader./output/cpdata.json./output/然后,当我们执行命令makebuild时,如下5行命令一次自动执行。再比如,有些程序在开发完成后可能需要运行在本地的Docker环境中。但是如果已经有同名容器在运行,我们必须先停止容器,删除容器,然后再运行。但是如果你有一个Makefile,这只是一行命令:deploy:dockerbuild-txxx:latestdockerstopjson_readerdockerrmjson_readerdockerrun--namejson_reader--networkhost-dxxx:latest另外,Makefile还支持多个名字串联下的shell命令。比如我想先把代码格式化,然后编译成可执行文件,最后用Docker部署。然后,我们最终的Makefile文件如下图所示:此时,我只需要在项目根目录下执行命令make,不带任何参数,fmt、build、deploy下的所有Shell命令都会依次执行.从而大大减轻了我们的工作量。可以说,无论是Golang项目、Python还是其他项目,使用Makefile自动执行一些繁琐重复的命令都是一劳永逸的事情。本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。
