我对蚂蚁有一个奇怪的问题。我想有条件地执行一个步骤,所以我创建了非常简单的示例:
<project name="TestProj" default="def">
<property name="prop1" value="xxx"/>
<target name="init">
<echo message="init step"/>
</target>
<target name="def" depends="init">
<echo message="def step"/>
<condition property="should.run">
<equals arg1="${prop1}" arg2="xxx"/>
</condition>
<echo message="outside check"/>
</target>
<target name="yes" if="${should.run}" depends="def">
<echo message="yeah,should run"/>
</target>
<target name="no" unless="${should.run}" depends="def">
<echo message="no,dont run"/>
</target>
输出为:
init:
[echo] init step
def:
[echo] def step
[echo] outside check
因此,我的条件步骤根本没有运行。
我的例子有什么问题?提前感谢您的任何建议。
if
和unless
采用属性的名称来检查是否存在,而不是值。所以你应该使用if="should.run"
,unless="should.run"
。
主要问题似乎在于您的目标依赖项,而不是您的条件。您的yes
和no
目标取决于def
,而不是相反。因此,调用def
只会def
和init
运行(因为def
取决于init
(。您需要创建调用yes
和no
的第三个目标或扩展点,以便按预期工作。
<extension-point name="all" depends="yes,no" />
请注意,PavelS之前发布的另一个答案有一定的道理。如果要在目标条件中使用属性引用而不是属性名称,则必须修改条件任务,以便在布尔计算为 false 的情况下将条件属性显式设置为false
(否则condition
任务根本不会设置属性。
<condition property="should.run" value="true" else="false>
<equals arg1="${prop1}" arg2="xxx" />
</condition>