我有一个数据文件data.json
,一个将处理数据文件render
的脚本,和3个模板文件accounts.template
,locals.template
和header.template
。
目标分别称为accounts
和locals
,并与保存在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,,$@)
这是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会考虑使用最新文件。