项目工程中如何使用make来管理常用的命令
目录
本文目的不在于,比较命令管理器的优缺点,而是告诉你,巧用工具,可以让事件更简单。
前端开发工程师,使用 npm 来对前端工程进行依赖管理,这没什么好说的。package.json 中包含的 scipts 段,就是把经常使用到的执行命令管理起来,方便执行。
那如果不是前端工程或者相应的工程开发没有这种工具怎么办?
{
...
"scripts": {
}
...
}
基本方法思路有几个:
- 如果命令复杂的,使用定制化脚本,如windows用bat包装命令,linux、macos 使用 shell
- 如果bat、shell难以胜任或者不好驾驭的,可以使用python、ruby。
- 如果命令比较简单,最轻量、最简单的选择则是 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
类似于上面的 build
、all
,称为 target,all 后带有 build,表示执行all之前先执行 build。
注意,目标下的命令前需要缩进一个 tab
符号,不是空格,Makefile 格式要求。
# 执行 build
> make build
# 执行 build + echo
> make all
本人经常在非程序开发中使用 make 来管理命令。比如,在写一套 makedown 文档后,需要预处理一些符号或者批量替换、合并,命令太长不好记,就用 Makefile 记录相应命令,然后通过 make 执行。
make 常见问题 #
前面提过,make 不是一个 shell 环境,只是针对 Makefile 做解析并执行其中的目标,与命令本身的语言实现无关,只要在命令行能被执行的命令都可以。
从哪里可以找到 make #
linux、macos 都带有 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的情况下才使用,因为实在比较不太好写。
更具体的用法,参见 官方文档 。