Как заставить make автоматически реагировать на дополнительные шаблоны для тех же исходных данных? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть файл данных data.json, скрипт, который будет обрабатывать файл данных render, и 3 файла шаблона accounts.template, locals.template и header.template.

Цели называются accounts и locals и относятся к расширению соответствующего шаблона с данными, хранящимися в data.json. Ничего особенно сложного.

Цели и data.json находятся в каталоге root для проекта. Сценарий render находится в ./scripts. Шаблоны находятся в ./scripts/templates.

В настоящее время мой Makefile выглядит следующим образом ...

render: data.json scripts/render locals accounts
    @echo Completed

locals: data.json scripts/render scripts/templates/locals.template scripts/templates/header.template
    @echo "Building locals"
    @echo "------------------"
    @php scripts/render locals
    @echo ""

accounts: data.json scripts/render scripts/templates/accounts.template scripts/templates/header.template
    @echo "Building accounts"
    @echo "--------------------"
    @php scripts/render accounts
    @echo ""

Это на самом деле не расширяется. У меня есть еще около 20 различных шаблонов для генерации из файла data.json (данные МОГУТ разбиваться на 1 json файл на шаблон, если требуется).

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

В принципе, если у меня есть шаблон, который НЕ называется header (header - это просто баннер "НЕ РЕДАКТИРОВАТЬ" для сгенерированного контента - его перемещение я думаю, что scripts/templates/common было бы разумно здесь), затем запустите сценарий render с именем шаблона в качестве аргумента (без части '.template').

Это выполнимо?

Кроме того, есть ли способ аннулировать цели, если они были отредактированы (их не должно было быть, потому что это большой большой баннер), поэтому принудительно пересобрать, если make запускается снова?

EDIT : Обновлен Makefile на основе комментариев ниже.

TEMPLATES := $(patsubst scripts/templates/%.template.php,%.tf,$(wildcard scripts/templates/*.template.php))

render: $(TEMPLATES)
    @echo Completed

%.tf: scripts/templates/%.template.php scripts/templates/common/header.template.php locals.json scripts/render.php
    @php scripts/render.php $(subst .tf,,$@)

1 Ответ

1 голос
/ 14 апреля 2020

Это простое применение шаблонных правил :

TEMPLATES := $(filter-out header,$(patsubst scripts/templates/%.template,%,$(wildcard scripts/templates/*.template)))

render: $(TEMPLATES)
          @echo Completed

%: scripts/templates/%.template scripts/templates/header.template data.json scripts/render  
        @echo "Building $@"
        @echo "------------------"
        @php scripts/render $@
        @echo ""

Что касается кого-то, редактирующего цели, то нет хорошего способа сделать это, потому что make работает только во время модификации. Нет никакого способа узнать, что цель изменена, потому что нет ничего, с чем можно сравнить ее, что скажет вам об этом, и даже если вы добавите временный файл для обнаружения этого, make ничего не сделает, потому что цель будет новее, чем временный файл, так что make будет считать его современным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...