如何在perl中为makefile执行循环



我正在尝试使用makefileperloneliner自动创建php类。

我有这个文件document.txt

[ENTITY]
Document
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

第一行基本上是classname,第二行是Bundlename,第三行是fields

我在make文件中使用这个来执行symfony命令来生成类

MYFILE = Entity/document.txt
READ_ENTITY=eval `perl -l -00pe 'y/nr[]/ /d; s/([A-Z]+) (w+) (w+) (.*)/$$1=$$3:$$2nFIELDS="$$4"n/g' $1`
mytest:
$(call READ_ENTITY,$(MYFILE)) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS" 

这对一个实体来说运行良好。(我用$$逃脱了$)

现在我的条件是在循环中有多个实体

document.txt

[ENTITY]
Document
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)
[ENTITY]
Document2
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)
[ENTITY]
Document3
MyDefaultBundle
number:string(200)
issueDate:datetime
expiryDate:datetime
file_path:string(200)
filename:string(200)
description:text
document_type:string(200)

所以我想在循环中执行该语句。我不知道如何在make文件中做到这一点。

基本上是用eval使shell变量ENTITYFIELDSAND,然后在symfony命令行中使用

有什么想法吗??

编辑:

对于上面显示的perl命令document.txt,即输入

perl-command的输出是

ENTITY=MyDefaultBundle:Document
FIELDS="number:string(200) issueDate:datetime expiryDate:datetime file_path:string(200) filename:string(200) description:text document_type:string(200)"

这基本上使它们成为shell变量,这样我就可以用$ENTITY插入它们

问题是,当我有多个用空格分隔的[ENTITY]时,我不能将其用作覆盖ENTITY VARIABLE的最后一个条目。

我想要一些类似的东西

for [ENTITY] IN document.txt
EXECUTE $(call READ_ENTITY,$(MYFILE)) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS"

因此,在每个循环中,我有不同的ENTITYFIELDS变量

如果您使用makefile模式规则,则此处可能不需要循环。

  1. 为每个输出php文档创建一个输入文件
  2. 创建一个模式规则,该规则接受一个输入文件并生成一个php文档。确保该命令生成的文件是目标名称:

    # Take input files from Entity/, produce outputs in Documents/
    Documents/Document%.php : Entity/document%.txt
    EXECUTE $(call READ_ENTITY,$<) && $(SYMFONY_COMMAND) --entity=$$ENTITY --fields="$$FIELDS" --output-filename=$@
    
  3. 创建一个依赖于需要构建的文档的规则:

    all : Documents/Document1.php Documents/Document2.php Documents/Document3.php
    .PHONY: all
    
  4. 调用make all。如果目标all是生成文件中的第一个目标(这是一种约定),那么只需要make

最新更新