使用 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.

你想要做的是让 targets 迭代。下面的例子演示了用法:

输入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