提问人:Markers 提问时间:5/8/2022 更新时间:5/14/2022 访问量:124
使用 phing ForEach 循环执行任务
Use a phing ForEach loop to execute tasks
问:
我想在Phing构建中执行任意选择的任务。
我正在传递一个用于构建的模块列表。每个模块都属于特定类型。类型在名称中指定为 {type}_{unitname}。我从一个构建文件开始,该文件采用单个模块名称并构建它,工作正常。我现在想传入一个模块列表,并让它构建所有模块。(我真正想做的是从XML清单文件加载模块列表,但也许一次只能加载一件事)。
我尝试了多种方法,发现每种方法都有问题。
我似乎需要一个临时任务来从模块名称派生我的属性(任务和相关目录设置)。这似乎会引起问题,但一开始不会。
起初,我尝试使用循环变量作为目标
<foreach list="${mylist}" param="item" target="${item"} />
但它似乎不允许变量作为目标名称。所以我把它分成两个任务。
<foreach list="${parts}" param="dTarg" target="doIt" >
<task name="DoIt">
<phingcall target="build">
<property name="extension" value="${dTarg}" />
</phingcall -->
</task>
我在这里的问题是(我认为)“扩展”是一个常数,因此不能被覆盖。我尝试使用“var”,文档说这是一回事,但我的设置抱怨它不存在。它是 3.0 功能吗?我正在运行 2.17。
因此,我尝试将“phingcall”更改为“phing”,并将我的主要功能放在一个单独的文件中。在这里,我再次遇到了临时任务的问题。如果我把它放在“从属”文件中,它会抱怨说,当第二次调用该文件时,它被重新声明了(我认为,该消息不是很有帮助)。如果我将它留在主文件中,即使设置了 inheritrefs 和 inheritall,从属文件也找不到它。
如何执行列表中名称的任务?
答:
起初,我尝试使用循环变量作为目标
<foreach list=“${mylist}” param=“item” target=“${item”} />
但它似乎不允许变量作为目标名称
任务的属性能够使用变量作为值,但此时尚不可用,但在目标中可用。target
foreach
param="item"
所以我把它分成两个任务。
<foreach list="${parts}" param="dTarg" target="doIt" > <task name="DoIt"> <phingcall target="build"> <property name="extension" value="${dTarg}" /> </phingcall> </task>
在这里,您尝试使用一个根本不有效的任务。task
target
相反,你要做的是让 s 进行迭代。以下示例演示了用法:target
输入 build.xml
<?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="main">
<property name="mylist" value="A,B,C" />
<target name="main">
<foreach list="${mylist}" param="item" target="DoIt"/>
</target>
<target name="DoIt">
<echo>${item}</echo>
</target>
</project>
输出
test > main:
test > DoIt:
[echo] A
test > DoIt:
[echo] B
test > DoIt:
[echo] C
BUILD FINISHED
复杂示例(包含属性重写和 inheritAll)
<?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="main">
<property name="mylist" value="A,B,C" />
<target name="main">
<foreach list="${mylist}" param="item" target="DoIt"/>
</target>
<target name="DoIt">
<phingcall target="${item}" inheritAll="true">
<property name="extension" override="true" value="${item}-ext" />
</phingcall>
</target>
<target name="A">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
<target name="B">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
<target name="C">
<echo>Inside target ${item} with ${extension} extension</echo>
</target>
</project>
输出
test > main:
test > DoIt:
test > A:
[echo] Inside target A with A-ext extension
test > DoIt:
test > B:
[echo] Inside target B with B-ext extension
test > DoIt:
test > C:
[echo] Inside target C with C-ext extension
BUILD FINISHED
示例 使用列表中的值更改为一个任务执行
<?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="main">
<property name="mylist" value="A,B,C" />
<target name="main">
<foreach list="${mylist}" param="item" target="DoIt"/>
</target>
<target name="DoIt">
<phingcall target="build">
<property name="extension" override="true" value="${item}-ext" />
</phingcall>
</target>
<target name="build">
<echo>Inside target build with ${extension}</echo>
</target>
</project>
输出
test > main:
test > DoIt:
test > build:
[echo] Inside target build with A-ext
test > DoIt:
test > build:
[echo] Inside target build with B-ext
test > DoIt:
test > build:
[echo] Inside target build with C-ext
BUILD FINISHED
简化和最终构建
<?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="main">
<property name="mylist" value="A,B,C" />
<target name="main">
<foreach list="${mylist}" param="item" target="build">
<property name="extension" override="true" value="${item}-ext" />
</foreach>
</target>
<target name="build">
<echo>Inside target build with ${extension}</echo>
</target>
</project>
输出
test > main:
test > build:
[echo] Inside target build with A-ext
test > build:
[echo] Inside target build with B-ext
test > build:
[echo] Inside target build with C-ext
BUILD FINISHED
上一个:如何使用phing从清单文件生成
评论