Makefile使用

Author:Gao
Created At:2018-05-16

为什么使用 make

在项目中部署使用了 makefile 配置,来方便快速的执行一些工作流

相比于其它 task runner,make 的优势是不需要安装,所有系统当前都已经预置

方便,是最大的原因

目前使用的 makefile 如下:

GREEN=\033[0;32m
NC=\033[0m
INSTALL_DIR=/usr/local/public
PUBLIC=./public
HOST=10.1.101.60
TARFILE=assets.tar.bz2
HASHFILE=assets.hash.txt

.ONESHELL:

default:
	@cat ReadMe

zddi:
	@rm -rf public/assets/*
	@./yarn run build

watch:
	@./yarn watch

build-system:
	@./yarn --offline

rebuild-system:
	@./yarn cache clean
	@rm -rf node_modules
	@rm -f yarn.lock
	@./yarn

tar:
	@cd ${PUBLIC} ;\
	tar jcf ${TARFILE} assets

rmtar:
	@cd ${PUBLIC} ;\
	rm ${TARFILE}

commit: tar
	@-cd ${PUBLIC} ;\
	SHASUM=$(shell shasum ${PUBLIC}/${TARFILE} | awk '{print $$1}') ;\
	echo $${SHASUM} > ${HASHFILE} ;\
	git add ${HASHFILE} ;\
	git commit -nm "create checksum commit HASH: [$${SHASUM}]" ;

upload: commit
	@cd ${PUBLIC} ;\
	SHASUM=$(shell shasum ${PUBLIC}/${TARFILE} | awk '{print $$1}') ;\
	COMMIT=$(shell git log -1 --pretty=format:%H) ;\
	BRANCH=$(shell git rev-parse --abbrev-ref HEAD) ;\
	curl -X POST http://${HOST}/api/web_build/upload \
 -F hash=$${SHASUM} \
 -F user=$(shell git config --get user.name) \
 -F commit=$${COMMIT} \
 -F branch=$${BRANCH} \
 -F assets=@./${TARFILE}

push: zddi upload rmtar

download:
	@cd ${PUBLIC} ;\
	curl http://${HOST}/api/web_build/$(shell cat ${PUBLIC}/${HASHFILE}) > ${TARFILE}

install: download
	@rm -rf ${PUBLIC}/assets
	@cd ${PUBLIC} ;\
	tar jxf ${TARFILE}
	@rm -rf ${INSTALL_DIR}
	@cp -r ${PUBLIC} /usr/local/
	@rm -rf ${PUBLIC}/assets
	@rm ${PUBLIC}/${TARFILE}
	@rm /usr/local/${PUBLIC}/${TARFILE}
	@echo -e "Install public folder to ${GREEN}${INSTALL_DIR}${NC}"

pull: download
	@rm -rf ${PUBLIC}/assets
	@cd ${PUBLIC} ;\
	tar jxf ${TARFILE}
	@rm ${PUBLIC}/${TARFILE}
	@echo -e "${GREEN}Code pull from remote done!${NC}"


定义变量

makefile 中的变量定义和 shell 中一样,都可以直接使用

abc = 123
bcd += ddd
cc := f2

shel 中的变量

由于 makefile 中的变量和 shell 格式一样,所以当要使用 shell 变量时,会需要使用转 义序列来处理,方式是两个$符号

shell

makefile 中的 shell 使用需要注意,每一行都会启动一个 shell,单独运行当调用 shell 进行插值的时候,shell 的执行顺序也不是顺序执行的

由于都是使用单独的 shell,所以当想要使用相同的上下文时,可以使用.ONESHELL指令 设置,或者是转义换行符

连续的 task

由于 makefile 中 shell 无法连续执行,所以,将 task 拆分成多个,然后通过 task 依 赖关系顺序执行

task 依赖,在 task 后输入其它的 task 名称,就会按照顺序,连续执行这些 task

当出现错误,task 队列会中断,这时需要在 shell 开始的行添加一个-来继续执行 task