能否为Make传递CLI标志?合并Makefile中的Symfony命令目标
问题:如何在Makefile中通过标志合并两个Symfony命令目标?
我有一个Makefile,其中添加了两个在Docker容器内运行Symfony命令的目标:
amqp-poll: ## Start amqp polling @$(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll" amqp-purge: ## Purge amqp queues @$(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll --purge"
请问是否可以传入一个标志,例如执行make amqp-poll --purge而非make amqp-purge?换句话说,我希望合并这两个目标,通过双短横线标志选择性触发第二个目标的逻辑。(我了解过ifdef,但它似乎需要一个值,我更倾向于使用简单的标志。)这是否可行?
解决方案
完全可以实现,这里提供两种简洁的实现方案:
方案1:Make原生变量传递(推荐)
无需使用--标志,直接通过Make的变量赋值语法传递触发条件,执行时通过make amqp-poll PURGE=1触发清理逻辑,Makefile实现如下:
amqp-poll: ## Start amqp polling, add PURGE=1 to purge queues @if [ -n "$(PURGE)" ]; then \ $(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll --purge"; \ else \ $(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll"; \ fi
执行命令:
- 启动普通轮询:
make amqp-poll - 清理队列:
make amqp-poll PURGE=1
方案2:支持--purge命令行标志
如果坚持要使用--purge格式,可以通过过滤MAKECMDGOALS变量实现,需要先将--purge从目标列表中移除,避免Make将其视为不存在的目标:
# 检测并处理--purge标志 ifneq ($(filter --purge,$(MAKECMDGOALS)),) PURGE := 1 MAKECMDGOALS := $(filter-out --purge,$(MAKECMDGOALS)) endif amqp-poll: ## Start amqp polling, append --purge to purge queues @if [ -n "$(PURGE)" ]; then \ $(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll --purge"; \ else \ $(DOCKER_COMPOSE) exec -it $(SERVICE_CONTAINER) /bin/bash -c "php /code/backend/app-new/console amqp:poll"; \ fi
执行命令:
- 启动普通轮询:
make amqp-poll - 清理队列:
make amqp-poll --purge
补充说明
- 方案1更贴合Make的原生语法,逻辑简单不易出错;方案2满足你对
--purge格式的需求,但需要额外处理目标过滤,否则Make会抛出“没有规则可以制作目标--purge”的错误。 - 你提到的
ifdef也可使用,比如将判断逻辑改为ifdef PURGE,执行时传递make amqp-poll PURGE=(即使无值也能触发判断),不过用-n判断变量是否非空的写法更直观。
内容的提问来源于stack exchange,提问作者Mayor of the Plattenbaus
相关产品推荐
相关产品推荐

