2017-07-08 102 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>