我如何获得对相同源数据的其他模板的自动反应?

问题描述 投票:0回答:1

我有一个数据文件data.json,一个将处理数据文件render的脚本,和3个模板文件accounts.templatelocals.templateheader.template

目标分别称为accountslocals,并与保存在data.json中的数据有关的相应模板的扩展有关。没什么特别复杂的。

目标和data.json位于项目的根目录中。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可以强制进行重建?

编辑:根据以下注释更新了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,,$@)
makefile
1个回答
1
投票

这是pattern rules的直接应用:

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会考虑使用最新文件。

© www.soinside.com 2019 - 2024. All rights reserved.