使用 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。
如何执行列表中的任务?
At first I tried to use the loop variable as the target
<foreach list="${mylist}" param="item" target="${item"} />
but it doesn't seem to allow a variable as a target name
foreach
任务的target
属性可以使用变量作为值,但此时param="item"
尚不可用,但在目标中可用。
So I split it up into two tasks.
<foreach list="${parts}" param="dTarg" target="doIt" >
<task name="DoIt">
<phingcall target="build">
<property name="extension" value="${dTarg}" />
</phingcall>
</task>
这里你尝试使用一个 task
任务,它根本不是一个有效的 target
.
你想要做的是让 target
s 迭代。下面的例子演示了用法:
输入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 构建中执行任意选择的任务。
我正在传递用于构建的模块列表。每个模块都是特定类型的。类型在名称中指定为 {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。
如何执行列表中的任务?
At first I tried to use the loop variable as the target
<foreach list="${mylist}" param="item" target="${item"} />
but it doesn't seem to allow a variable as a target name
foreach
任务的target
属性可以使用变量作为值,但此时param="item"
尚不可用,但在目标中可用。
So I split it up into two tasks.
<foreach list="${parts}" param="dTarg" target="doIt" > <task name="DoIt"> <phingcall target="build"> <property name="extension" value="${dTarg}" /> </phingcall> </task>
这里你尝试使用一个 task
任务,它根本不是一个有效的 target
.
你想要做的是让 target
s 迭代。下面的例子演示了用法:
输入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