Make 实践
作者:郑凯
这只是我个人摸索出来的方法,不确认是否是“最佳”实践
很多时候写的东西无法热更,如我目前正在写一些 golang 和 nodejs 的东西。总之一个常见需求是需要快速重启一个 server 以用来调试。
首先有一个启动脚本,做以下必要操作,并且在敲 make
的时候不带参数时会默认执行
- 关闭之前运行的 server(如果有)
- 初始化环境(如没有
node_modules
目录则npm i
) - 初始化配置
- 启动 server 并记录 PID 到文件
如果分得细一些(比如在 golang 里),启动是分 build 和 start 两个动作,例如开机自动运行只跑 start,只有手敲 Make 的时候才会 build + start。
启动细节
记录 PID 是很重要的一点,我见过很多人在启动脚本里使用
killall
,甚至有人根本不知道如何正确在一台电脑上启动多个实例,如果一定要做,他们只会用
ps aux | grep
来肉眼识别并手动 kill
。
在 bash 脚本里,可以用 $!
来获取前一个命令的 PID。
kill
的时候要注意,因为记录在文件里的 PID 可能失效了(比如你电脑重启过,但是
PID 文件还在),而恰好有别的程序占用了这个 PID,可能会
kill
错,所以我写了个脚本 safe-kill.sh
来操作,它需要第二个参数,是你所运行的程序完整路径,看 safe-kill.sh
的代码可知,就是从类似
/proc/10230/exe
这种路径的软链指向,来确认是否是想 kill
的程序。
另外有时候我可能在一台电脑上运行很多个 server,我喜欢启动的时候用完整绝对路径,
这样不会在 ps
的看到一堆诸如 node ./app
而无从下手。
日常使用
我的习惯是,而 make
启动的脚本,会 nohup
启动并重定向标准输出,由专门的窗口去
tail -f
看 log,这样在任何窗口都可以敲 make
(还有个小细节是每次 make
时前一个文件不要删,而是改名为类似 prev.log
,可能用到)
我略微改进了 make
:如果当前目录没有
Makefile
文件,它会不断向上一级目录查找,这样在很深的子目录也可以 make。
我也写了个 VIM 脚本 来在编辑器里用热键执行
make
,如果一切顺利只会在状态栏下面有行提示,如果失败则显示整个 make
输出。