2009-10-24 12 views
13

में दो गुणों को कैसे सेट करें I Ant में दो बूलियन पर निर्भर दो अलग-अलग चरों के लिए दो अलग-अलग तारों को असाइन करने का प्रयास कर रहा हूं।चींटी (1.6.5) - एक <condition> या <if>

स्यूडोकोड (ish):

if(condition) 
    if(property1 == null) 
     property2 = string1; 
     property3 = string2; 
    else 
     property2 = string2; 
     property3 = string1; 

मैं क्या कोशिश की है है,

<if> 
    <and> 
    <not><isset property="property1"/></not> 
    <istrue value="${condition}" /> 
    </and> 
    <then> 
    <property name="property2" value="string1" /> 
    <property name="property3" value="string2" /> 
    </then> 
    <else> 
    <property name="property2" value="string2" /> 
    <property name="property3" value="string1" /> 
    </else> 
</if> 

लेकिन मैं "<if>" युक्त लाइन के लिए एक नल पॉइंटर एक्सेप्शन मिलता है। मैं इसे <condition property=...> टैग का उपयोग करके काम करने के लिए प्राप्त कर सकता हूं लेकिन एक समय में केवल एक ही संपत्ति सेट कर सकता हूं। मैंने <propertyset> का उपयोग करने की कोशिश की लेकिन इसकी अनुमति नहीं थी।

मैं चींटी के लिए नया हूं जैसा कि आपने शायद अनुमान लगाया होगा :)।

गाव

उत्तर

34

ऐसा करने के कई तरीके हैं।

<condition property="property2" value="string1"> 
    <isset property="property1"/> 
</condition> 
<condition property="property3" value="string2"> 
    <isset property="property1"/> 
</condition> 

<!-- Properties in ant are immutable, so the following assignments will only 
    take place if property1 is *not* set. --> 
<property name="property2" value="string2"/> 
<property name="property3" value="string1"/> 

इसमें कुछ समय बोझिल है और अच्छी तरह से स्केल नहीं करता है, लेकिन सिर्फ दो गुणों के लिए मैं शायद इस दृष्टिकोण का प्रयोग करेंगे: सबसे सरल सिर्फ दो condition बयानों का उपयोग करने, और संपत्ति अचल स्थिति का लाभ लेने के लिए है।

<target name="setProps" if="property1"> 
    <property name="property2" value="string1"/> 
    <property name="property3" value="string2"/> 
</target> 

<target name="init" depends="setProps"> 
    <!-- Properties in ant are immutable, so the following assignments will only 
     take place if property1 is *not* set. --> 
    <property name="property2" value="string2"/> 
    <property name="property3" value="string1"/> 

    <!-- Other init code --> 
</target> 

हम फिर से यहाँ संपत्ति अचल स्थिति का लाभ उठा रहे:

एक कुछ हद तक बेहतर तरीके से एक सशर्त लक्ष्य का प्रयोग है। आप ऐसा नहीं करना चाहते हैं, तो आप unless विशेषता है, और अविवेक के एक अतिरिक्त स्तर का उपयोग कर सकते हैं:

<target name="-set-props-if-set" if="property1"> 
    <property name="property2" value="string1"/> 
    <property name="property3" value="string2"/> 
</target> 

<target name="-set-props-if-not-set" unless="property1"> 
    <property name="property2" value="string2"/> 
    <property name="property3" value="string1"/> 
</target> 

<target name="setProps" depends="-set-props-if-set, -set-props-if-not-set"/> 

<target name="init" depends="setProps"> 
    <!-- Other init code --> 
</target> 

यह ध्यान रखें कि target की if और unless गुण केवल जाँच करता है, तो संपत्ति है महत्वपूर्ण है संपत्ति का मूल्य निर्धारित करें।

+2

धन्यवाद, व्यापक उत्तर। – gav

+0

बस मुझे क्या चाहिए। चींटी पर अपने मस्तिष्क के लिए धन्यवाद, वापस '0 9 में। –

1

आप Ant-Contrib लाइब्रेरी का उपयोग एक साफ <if><then><else> वाक्यविन्यास तक पहुंचने के लिए कर सकते हैं, हालांकि इसे कुछ डाउनलोड/इंस्टॉल चरणों की आवश्यकता होगी।

यह अन्य SO प्रश्न देखें: ant-contrib - if/then/else task

संबंधित मुद्दे