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"目标中打印,但无法从调用目标中检索值.
我也知道不可能两次为属性赋值.但问题甚至没有发生......当它出现这种情况时,我可以在分配之前添加对属性值的检查,以确保它尚未初始化...
你有解决问题的方法吗?
非常感谢您的帮助:)
<for>从ant-contrib 尝试任务而不是<foreach>.该<for>任务利用了后来出现的Ant宏设施.它比旧<foreach>任务更快,更灵活.使用时,您处于相同的项目上下文中<for>.这意味着循环中设置的属性将在循环外部可见.当然,属性的正常规则适用...你只需要设置一次......除非你使用<var>ant-contrib中的任务来覆盖或取消设置以前设置的属性.
啊蚂蚁黑客的快乐啊.
即使由于 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”目标中设置之前实例化。