一日一技:5分钟掌握 Makefile

系统 Linux
要学习 Makefile,你需要有一个Linux 或者 macOS,然后需要知道两个概念:make命令和Makefile文件。其中,Makefile文件是你自己写的一个文本文件,它的名字叫做Makefile,不能修改大小写,只能叫这个名字。而make是 macOS 和 Linux 中自带的一个命令。

[[394191]]

在前几天的文章:一日一技:为 Python 项目编写 Makefile一文中,我们讲到了 Makefile。这几天不少同学在公众号后台留言,想进一步了解如何编写 Makefile。于是,就有了今天这篇文章。

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

 

 

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

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

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

 

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

  1. gofmt -w xxx.go 

运行以后,如下图所示:

 

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

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

要敲的键盘就更多了。

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

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

如下图所示:

 

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

Makefile文件的格式如下:

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

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

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

  1. fmt: 
  2.  gofmt -w *.go 
  3.  
  4. build: 
  5.  rm -rf output 
  6.  mkdir output 
  7.  go build -o JsonReader main.go 
  8.  mv JsonReader ./output
  9.  cp data.json ./output

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

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

  1. deploy: 
  2.  docker build -t xxx:latest 
  3.  docker stop json_reader 
  4.  docker rm json_reader 
  5.  docker run --name json_reader --network host -d xxx:latest 

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

 

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

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

本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

 

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2021-04-12 21:19:01

PythonMakefile项目

2021-10-15 21:08:31

PandasExcel对象

2021-04-27 22:15:02

Selenium浏览器爬虫

2021-05-13 09:01:51

Cloud Flare浏览器网站

2023-10-28 12:14:35

爬虫JavaScriptObject

2021-04-05 14:47:55

Python多线程事件监控

2021-09-13 20:38:47

Python链式调用

2022-06-28 09:31:44

LinuxmacOS系统

2024-07-30 08:16:18

Python代码工具

2024-07-30 08:11:16

2022-03-12 20:38:14

网页Python测试

2021-03-12 21:19:15

Python链式调用

2021-07-27 21:32:57

Python 延迟调用

2021-10-03 20:08:29

HTTP2Scrapy

2021-05-08 19:33:51

移除字符零宽

2024-05-24 09:07:06

JSONprint字符串

2024-07-19 18:23:17

2024-11-11 00:38:13

Mypy静态类型

2020-12-11 06:30:00

工具分组DataFrame

2021-02-14 22:22:18

格式图片 HTTP
点赞
收藏

51CTO技术栈公众号