惯用的 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}
上下文
我有一个 运行 docker
化服务
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}