Предварительные условия вызова несколько раз во время выполнения - PullRequest
0 голосов
/ 28 марта 2020

Я использую Make для обработки базовых c задач в проекте, и у меня есть следующая подпись в моем Makefile:

.PHONY: exec lint test

exec:
    docker-compose exec service ${CMD}

lint: CMD := npm run lint
lint: exec

test: CMD := npm run test
test: exec

Когда я запускаю команду make lint test, я хочу запускать npm run lint и npm run test внутри контейнера Docker.

Но, как я заметил, этого не происходит, поскольку make считает, что предварительное условие должно быть выполнено после запуска задачи lint и я получаю

make: ничего не нужно делать для 'test'.

сообщение при его вызове. Это совершенно понятно с точки зрения make, но это побочный эффект для моего использования.

Есть ли способ решить это внутри Makefile, не создавая сценарий оболочки, который будет выступать в качестве промежуточного звена агент

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Получив вдохновение от @madscientist и покопавшись в документации, я нашел то, что искал: Консервированные рецепты позволяют объявить список команд для повторного использования в нескольких задачах (рецептах).

Следующий пример удовлетворит пример из вопроса:

.PHONY: exec

define exec =
    docker-compose exec service ${CMD}
endef

lint: CMD := npm run lint
lint:
    $(exec)

test: CMD := npm run test
test:
    $(exec)

Хотя решение от @madscientist также может работать, я считаю, что это лучше, потому что оно не вызывает рекурсивный вызов make и задача не разбивается на две части (назначение переменной CMD и вызов задачи exec)

0 голосов
/ 28 марта 2020

Нет способа заставить make построить одну и ту же цель несколько раз в течение одного вызова make. Это просто не то, как это работает: он создает объект, а затем ожидает, что он будет обновляться до конца этого сеанса.

Вы можете использовать рекурсивные вызовы make, чтобы делать то, что вы хотите:

.PHONY: lint test exec

lint: CMD := npm run lint
test: CMD := npm run test

lint test:
        $(MAKE) exec CMD=$(CMD)

exec:
        docker-compose exec service ${CMD}
...