2017-07-08 74 views
0

我有一个奇怪的问题与蚂蚁。我想有条件地执行了一步,所以我创建非常简单的例子:蚂蚁跑步时满足条件

<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 

所以,我的条件步骤,不运行。

我的例子有什么问题?在此先感谢您的任何建议。

回答

0

if and unless取一个属性的名称来检查是否存在,而不是值。所以你应该使用if="should.run",unless="should.run"

+0

不是,if'和'unless'属性的行为会根据您是否提供属性名称或属性引用而改变。 run'被设置为'false'的值,如果'if =“$ {should.run}'会导致目标被跳过,但是如果if =”should.run“,目标仍然会运行。 – CAustin

0

主要问题似乎与您的目标依赖关系有关,而不是您的条件。您的yesno目标取决于def,而不是相反。所以调用def将只运行definit(因为def取决于init)。您需要创建第三个目标或扩展点,以调用yesno,以便按预期工作。

<extension-point name="all" depends="yes,no" /> 

请注意,PavelS之前发布的其他答案中有一些事实。如果要在目标条件中使用属性引用而不是属性名称,则必须修改条件任务,以便在布尔评估为false的情况下将条件属性显式设置为false(否则condition任务只会赢得' t设置属性

<condition property="should.run" value="true" else="false> 
    <equals arg1="${prop1}" arg2="xxx" /> 
</condition>