怎么掌握Makefile的知识

45次阅读
没有评论

共计 1758 个字符,预计需要花费 5 分钟才能阅读完成。

今天就跟大家聊聊有关怎么掌握 Makefile 的知识,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

如果你现在使用 macOS 或者 Linux,那么你可以在终端输入命令 man make,查看 make 命令的帮助文档,如下图所示:

通过 make 命令,你可以快速运行一大段 Shell 命令,从而实现一键编译代码,一键格式化代码等等功能。

要学习 Makefile,你需要有一个 Linux 或者  macOS,然后需要知道两个概念:make 命令和 Makefile 文件。其中,Makefile 文件是你自己写的一个文本文件,它的名字叫做 Makefile,不能修改大小写,只能叫这个名字。而 make 是  macOS 和 Linux 中自带的一个命令。当我们执行 make 命令的时候,它自动读取 Makefile 文件,从而决定自己要做什么事情。

我们来看一个实际例子。下图为一段很简单的 Golang 代码:

代码里面,有一些逗号后面没有空格,结构体也写得参差不齐。当我们要格式化一个.go 文件的时候,一般是在当前文件夹下面执行命令:

gofmt -w xxx.go

运行以后,如下图所示:

你为了执行这个命令,你需要敲 15 次键盘。而且如果你的项目里面有很多个.go 文件,并且他们位于不同的文件夹里面,那么你还需要执行命令:

find . -name  *.go  | xargs gofmt -w

要敲的键盘就更多了。

这个时候,我们可以在项目根目录创建一个 Makefile 文件,其内容如下:

fmt: find . -name  *.go  | xargs gofmt -w

如下图所示:

于是,当我们在项目根目录执行命令:make fmt 的时候,整个项目里面的所有.go 文件都会被自动格式化。

Makefile 文件的格式如下:

 名字 1: shell  命令 1  shell  命令 2  shell  命令 3   名字 2: shell  命令 4  shell  命令 5  shell  命令 6 

其中,名字 1 名字 2 用于执行命令 make 名字,每一个名字下面可以跟很多条 Shell 命令。这里看起来有点像是 Python   的缩进。但需要特别注意的是,Makefile 的缩进只能使用 Tab 键,不能使用空格。

我们再来举个例子,现在,我需要把项目编译生成一个可执行文件,然后把这个可执行文件连同 data.json 一起复制到 一个叫做 output   的文件夹中。那么,我们的 Makefile 可以这样写:

fmt: gofmt -w *.go build: rm -rf output mkdir output go build -o JsonReader main.go mv JsonReader ./output/ cp data.json ./output/

然后,当我们执行命令 make build 的时候,它下面的 5 行命令就一次性自动执行了。

再来一个例子,可能有一些程序开发完成以后,需要在本地 Docker   环境里面运行。但是如果已经有一个同名容器在运行了,我们必须先停止容器,删除容器,然后才能重新运行。但是如果有了  Makefile,这也就是一行命令的事情:

deploy: docker build -t xxx:latest docker stop json_reader docker rm json_reader docker run --name json_reader --network host -d xxx:latest

除此之外,Makefile 还支持串联多个名字下面的 shell 命令。例如,我想先格式化代码,然后编译成可执行文件,最后再使用 Docker   部署,那么,我们最终的 Makefile 文件如下图所示:

此时,我只需要在项目根目录中执行命令 make,不带任何参数,那么,fmt、build 和 deploy 下面的所有 Shell   命令都会按顺序依次执行。从而大大减少了我们的工作量。

可以说,无论是 Golang 项目还是 Python 还是其他项目,使用 Makefile 来自动化执行一些繁琐重复的命令,是一个一劳永逸的事情。

看完上述内容,你们对怎么掌握 Makefile 的知识有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计1758字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)