ANT:如何读取foreach循环中设置的属性

Lol*_*lue 6 ant foreach properties ant-contrib

亲爱的,我目前面临一些问题,需要检索foreach循环中设置的属性的值.也许你们其中一个可以帮助我......

目的是检查自生成相应jar后是否已修改文件夹的一个文件.这样我知道是否必须再次生成jar.我所做的是使用foreach循环遍历文件夹,如果一个文件与我的测试匹配,则将属性设置为true.

问题是我的变量在我的循环后似乎不存在...这是一个简化的代码示例,它有同样的问题:

<target name="target">
    <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${lib.dir}/ant-contrib.jar"></taskdef>
    <foreach target="setVar" param="var" list="a,b"/>
    <echo>myreturn in target: ${env.myreturn}</echo>
    <property name="env.myreturn" value="c"/>
    <echo>myreturn in second: ${env.myreturn}</echo>
</target>
<target name="setVar">
    <property name="env.myreturn" value="${var}"/>
    <echo>myreturn in setVar: ${env.myreturn}</echo>
</target>
Run Code Online (Sandbox Code Playgroud)

这段代码的结果是:

target:
setVar:
 [echo] myreturn in setVar: a
setVar:
 [echo] myreturn in setVar: b
 [echo] myreturn in target: ${env.myreturn}
 [echo] myreturn in second: c
BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

似乎该变量已正确设置,因为它可以在"setVar"目标中打印,但无法从调用目标中检索值.

我也知道不可能两次为属性赋值.但问题甚至没有发生......当它出现这种情况时,我可以在分配之前添加对属性值的检查,以确保它尚未初始化...

你有解决问题的方法吗?

非常感谢您的帮助:)

Kon*_*hik 7

<for>从ant-contrib 尝试任务而不是<foreach>.该<for>任务利用了后来出现的Ant宏设施.它比旧<foreach>任务更快,更灵活.使用时,您处于相同的项目上下文中<for>.这意味着循环中设置的属性将在循环外部可见.当然,属性的正常规则适用...你只需要设置一次......除非你使用<var>ant-contrib中的任务来覆盖或取消设置以前设置的属性.

啊蚂蚁黑客的快乐啊.


Lol*_*lue 3

即使由于 sudocode 我不再需要它,我也找到了问题的解决方案。也许对其他人有用......

一位同事谈到了 ant-contrib 的“antcallback”目标:它允许将结果从被调用的目标返回到调用的目标。通过“for”目标和“antcallback”的组合,可以做我想做的事情:

<target name="target">
    <taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${lib.dir}/ant-contrib.jar"></taskdef>
    <for param="file">
        <path>
            <fileset dir="../myDirectory" includes="**/*" />
        </path>
        <sequential>
            <antcallback target="setVar" return="retValue">
                <param name="file" value="@{file}"/>
            </antcallback>
        </sequential>
    </for>
    <echo>result: ${retValue}</echo>
</target>
<target name="setVar">
    <property name="retValue" value="${file}"/>
</target>
Run Code Online (Sandbox Code Playgroud)

“file”包含目录中文件的名称。它作为参数提供给被调用的目标,值为“@{file}”(由于“for”目标实现,“@”是必需的)。

在主目标的末尾,${retValue} 包含由“setVar”目标设置的第一个值。尝试多次设置它时不会引发错误,因此无需检查变量是否已在“setVar”目标中设置之前实例化。