идиоматический Makefile и аргументы команды

#docker #makefile #docker-compose #gnu-make

#docker #makefile #docker-создать #gnu-make

Вопрос:

Контекст

У меня есть Makefile для запуска 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 запуске).

Вопрос

Какой идиоматический способ указывать аргументы ARGS в зависимости от контекста?

$(eval ARGS=--service-ports) работает, но есть ли «правильный способ»?

Ответ №1:

eval Это определенно неправильно. Что, если кто-то запустится make server shell ? Теперь у shell будет установлен этот аргумент, потому что eval он сбрасывается глобально.

Есть ли какая-то причина, по которой вы не можете просто написать:

 server:
         $(RUN) --service-ports
  

? В общем, если вам нужна переменная, настроенная для каждой цели, у вас есть два варианта:

Вы можете использовать целевые переменные:

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

Или вы можете использовать рекурсивно расширяемые переменные:

 server_ARGS = --service-ports

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

server:
         $(RUN)
  

Ответ №2:

Я думаю, вы могли бы просто разделить свои переменные на большее количество частей:

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

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

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