跳到主要内容
  1. Skills/
  2. 善用工具/

项目工程中如何使用make来管理常用的命令

··字数 1328·3 分钟
make Makefile 命令管理

本文目的不在于,比较命令管理器的优缺点,而是告诉你,巧用工具,可以让事件更简单。

前端开发工程师,使用 npm 来对前端工程进行依赖管理,这没什么好说的。package.json 中包含的 scipts 段,就是把经常使用到的执行命令管理起来,方便执行。

那如果不是前端工程或者相应的工程开发没有这种工具怎么办?

{
    ...
    "scripts": {

    }
    ...
}

基本方法思路有几个:

  1. 如果命令复杂的,使用定制化脚本,如windows用bat包装命令,linux、macos 使用 shell
  2. 如果bat、shell难以胜任或者不好驾驭的,可以使用python、ruby。
  3. 如果命令比较简单,最轻量、最简单的选择则是 make

make的一点历史 #

很多前端工程师、java后端工程师,没有听过 make 这个神奇古老的工具。 要知道,make 的历史非常悠久。最早是被用来管理 c/c++ 程序开发的编译管理。在c/c++的编译时,通常需要指定编辑器参数、依赖文件、链接目标、编译顺序等,写成脚本又不便管理。

由于 make 本身的限制,后来又出现了 cmake,用来支持更大型更复杂的c++程序编译。不过,当 make 能胜任的,make 还是首选。

当然,make 是针对早期 c/c++ 程序开发需求而设计的,并不是任何场景都适合,毕竟它本身不是一个 shell环境。

make 最具特色的功能 #

make 执行时,会在查找当前目标的一个名为 Makefile 的文件,其中记录了可以被执行的目标,如

build:
    go build . ./...
all: build
    @echo hello world

类似于上面的 buildall,称为 target,all 后带有 build,表示执行all之前先执行 build。 注意,目标下的命令前需要缩进一个 tab 符号,不是空格,Makefile 格式要求。

# 执行 build
> make build
# 执行 build + echo
> make all

本人经常在非程序开发中使用 make 来管理命令。比如,在写一套 makedown 文档后,需要预处理一些符号或者批量替换、合并,命令太长不好记,就用 Makefile 记录相应命令,然后通过 make 执行。

make 常见问题 #

前面提过,make 不是一个 shell 环境,只是针对 Makefile 做解析并执行其中的目标,与命令本身的语言实现无关,只要在命令行能被执行的命令都可以。

从哪里可以找到 make #

linuxmacos 都带有 make 命令,而windows默认没有。可以通过官方下载地址下载: ftp.gnu.org/gnu/make/

scoop 的软件源已经包含了一个 make,也可以通过 scoop 安装。

本站有一篇文章简单介绍 scoop 的文章。

Makefile 中的目标与当前目录下的文件同名时 #

会出现这样的错误

> make public
make: `public' is up to date.

这时使用 .PHONY 来标记,告诉 make 这只是一个 target 目标,放心执行。

.PHONY :public
public:
    @echo hello

再次执行就是

# 加上 phony 后
> make public
hello

当 make 目标与文件名称相同时(不包含扩展) #

make xxx

当 xxx 为 xxx.c 文件时, 有

cc  xxx.c -o xxx

当 xxx 为 xxx.sh 脚本文件时, 有

cat xxx.sh >xxx
chmod a+x xxx

make 的高级应用 #

说高级应用,应该是对 make 熟悉一定程度之后,才去挑战。Makefile 中是支持写 if 这种的条件逻辑的,这种功能也就是简单到不动用 shell的情况下才使用,因为实在比较不太好写。

更具体的用法,参见 官方文档