我正在使用ant,我遇到if / then / else任务的问题,(ant-contrib-1.0b3.jar)。
我正在运行一些可以使用build.xml进行简化的东西。
我期待从'ant -Dgiv = Luke'获得消息
input name: Luke
should be overwritten with John except for Mark: John
但似乎属性“giv”在if / then / else中没有被覆盖..
input name: Luke
should be overwritten with John except for Mark: Luke
是否取决于我使用${giv}
等于任务的事实?
否则我的代码有什么问题?
build.xml代码:
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<property name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
答案 0 :(得分:34)
在Ant中,属性总是设置一次,之后该变量不再可变。
以下是使用标准Ant(不含ant-contrib
)的解决方案,这对于不想要额外依赖的用户非常有用。
<target name="test" >
<echo message="input name: ${param}" />
<condition property="cond" >
<equals arg1="${param}" arg2="Mark" />
</condition>
</target>
<target name="init" depends="test" if="cond">
<property name="param2" value="Mark" />
</target>
<target name="finalize" depends="init">
<property name="param2" value="John" />
<echo message="should be overwritten with John except for Mark: ${param2}" />
</target>
答案 1 :(得分:15)
Ant属性很难覆盖(如果不是不可能的话)。你需要的是Variable。这些也在Ant Contrib JAR中定义。
编辑您的示例:
<target name="ifthen">
<var name="Evangelist" value="${giv}" />
<echo message="input name: ${Evangelist}" />
<if>
<equals arg1="${Evangelist}" arg2="Mark" />
<then>
</then>
<else>
<var name="Evangelist" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${Evangelist}" />
</target>
答案 2 :(得分:2)
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<var name="giv" unset="true"/>
<property name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
我们也可以使用var
任务取消设置属性。
答案 3 :(得分:2)
我知道这已经过时了,但对于寻求解决方案的其他人来说应该会很方便。
在不使用ant-contrib的情况下重新分配属性,将macrodef与脚本一起使用。
<macrodef name="property-change">
<attribute name="name"/>
<attribute name="value"/>
<sequential>
<script language="javascript"><![CDATA[
project.setProperty("@{name}", "@{value}");
]]></script>
</sequential>
</macrodef>
然后在ant的任何地方,只需将其称为属性标记
<property-change name="giv" value="John"/>
要在原始版本的xml中实现它,它看起来像这样:
<project name="Friend" default="ifthen" basedir=".">
<property name="runningLocation" location="" />
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="${runningLocation}/antlib/ant-contrib-1.0b3.jar" />
</classpath>
</taskdef>
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<property-change name="giv" value="John" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
</project>
此示例仅作为编写宏以替换&lt; var&gt;的示例。 ant-contrib中的命令。在像这样的情况下,&lt; if&gt;正在使用命令,使用&lt; var&gt;更有意义已经加载了sinnce ant-contrib,并且&lt; var&gt;可能会更快处理。
希望这有帮助。
答案 4 :(得分:-1)
可以使用ant-contrib'propertycopy'重新分配属性的值。这是使用ant-contrib变量的替代方法。 这样可以覆盖属性“giv”。
<target name="ifthen">
<echo message="input name: ${giv}" />
<if>
<equals arg1="${giv}" arg2="Mark" />
<then>
</then>
<else>
<property name="tempName" value="John" />
<propertycopy name="giv" from="tempName" override="true" />
</else>
</if>
<echo message="should be overwritten with John except for Mark: ${giv}" />
</target>
请注意,这假设属性tempName尚未设置为“John”以外的值。