惯用的 Makefile 和命令参数

idiomatic Makefile and command arguments

上下文

我有一个 运行 docker 化服务

的 Makefile
RUN = docker-compose run $(ARGS) --rm serivce

.PHONY: shell
shell:
    ${RUN} /bin/sh

.PHONY: server
server:
    $(eval ARGS=--service-ports) ${RUN}

问题

server 任务需要设置额外的参数 (--service-ports) 来启动容器。 只是将参数硬编码到 RUN 中是行不通的,因为 shell 也会发布端口并且会失败(具有 server 运行ning)。

问题

根据上下文指定参数 ARGS 的惯用方法是什么?

$(eval ARGS=--service-ports) 可以,但是有 "right way" 吗?

这个eval肯定是不对的。如果有人跑 make server shell 怎么办?现在 shell 将设置该参数,因为 eval 全局重置它。

有什么原因你不能只写:

server:
         $(RUN) --service-ports

?一般来说,如果您需要基于每个目标定制的变量,您有两个选择:

您可以使用 target-specific variables:

server: ARGS = --service-ports
server:
         $(RUN)

或者您可以使用 recursively-expanded variables:

server_ARGS = --service-ports

RUN = docker-compose run $($@_ARGS) --rm service

server:
         $(RUN)

我认为您可以简单地将变量分成更多部分:

COMMAND = docker-compose run --rm $(ARGS)
CONTAINER = service

.PHONY: shell
shell:
    ${COMMAND} ${CONTAINER} /bin/sh

.PHONY: server
server:
    ${COMMAND} --service-ports ${CONTAINER}