使用 phing ForEach 循环执行任务

Use a phing ForEach loop to execute tasks

提问人:Markers 提问时间:5/8/2022 更新时间:5/14/2022 访问量:124

问:

我想在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,从属文件也找不到它。

如何执行列表中名称的任务?

phing的

评论


答:

1赞 Siad Ardroumli 5/14/2022 #1

起初,我尝试使用循环变量作为目标

<foreach list=“${mylist}” param=“item” target=“${item”} />

但它似乎不允许变量作为目标名称

任务的属性能够使用变量作为值,但此时尚不可用,但在目标中可用。targetforeachparam="item"

所以我把它分成两个任务。

<foreach list="${parts}" param="dTarg" target="doIt" >
<task name="DoIt">
    <phingcall target="build">
        <property name="extension" value="${dTarg}" />
    </phingcall>
</task>

在这里,您尝试使用一个根本不有效的任务。tasktarget

相反,你要做的是让 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