2013-11-20 3 views
6

एंट 1.9.1 में निष्पादित नहीं किया जाएगा, आपके पास अधिकांश कार्यों पर if and unless attributes का उपयोग करने की क्षमता है। मेरी मैक्रोचींटी अगर: सच है। संपत्ति को सही पर सेट करने से कार्य को

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
    description="Test the autoconfiguration templates and answers"> 
    <test.templates 
     if:true="test.templates" 
     template.root.dir="${main.dir}" 
     answers.dir="${main.config.dir}"/> 
</target> 

बहरहाल, यह नहीं चलेगा - भले ही संपत्ति test.templates सही पर सेट किया जाता है:

मैं एक मैक्रो मैं जहाँ मैं इन कार्यों को चलाने के लिए कोशिश कर रहा हूँ परिभाषित किया है की है। अगर मैं उस रेखा को हटा देता हूं, तो मेरा test.template मैक्रो काम करेगा।

क्या उपयोगकर्ता परिभाषित मैक्रो में if:true का उपयोग कर कोई समस्या है? इस मुद्दे को हल करने का सबसे अच्छा तरीका क्या है?

+0

मैंने देखा आप एक लक्ष्य, संपत्ति और मैक्रो सभी तथाकथित "test.templates" –

+0

एक बग रिपोर्ट भरा है समस्या के बाद अभी भी बना हुआ 2 9 दिसंबर, 2013 से नई चींटी रिलीज के साथ - विवरण के लिए मेरा अद्यतन उत्तर EDIT (2) देखें। – Rebse

+0

समाधान मिला - मेरा अद्यतन उत्तर EDIT (3) देखें! – Rebse

उत्तर

7

ant manual से:

के बाद से चींटी 1.9.1 यह सब कार्यों और नेस्टेड तत्वों विशेष नामस्थान का उपयोग करने पर अगर और जब तक विशेषताओं को जोड़ने के लिए संभव है।

अगर और जब तक अब तक एक macrodef में विशेषताओं नई उपयोग नहीं किया था, लेकिन निम्नलिखित स्निपेट काम करता है:

<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <attribute name="whentrue"/> 
    <sequential> 
     <echo if:true="${@{whentrue}}">@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar whentrue="foo" bla="yada,yada"/> 

    </project> 

सूचना => संपत्ति वाक्य रचना <echo if:true="${@{whentrue}}">, यह का उपयोग करते समय काम नहीं करता है @ {whentrue} केवल।

आउटपुट:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
[echo] yada,yada 

मेरे अन्य कोशिश:

<macrodef name="foobar" if:true="foo"> 
<attribute name="bla"/> 
<sequential> 
    <echo>@{bla}</echo> 
</sequential> 
</macrodef> 

<echo>${ant.version}</echo> 
<foobar bla="yada,yada"/> 

काम नहीं किया:

... Problem: failed to create task or type foobar 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 

भी मान लिया है कि <foobar bla="yada,yada" if:true="foo"/> की तरह कुछ काम करेगा:

012,
<project xmlns:if="ant:if" xmlns:unless="ant:unless"> 

    <property name="foo" value="true"/> 

    <macrodef name="foobar"> 
    <attribute name="bla"/> 
    <sequential> 
    <echo>@{bla}</echo> 
    </sequential> 
    </macrodef> 

    <echo>${ant.version}</echo> 
    <foobar bla="yada,yada" if:true="foo"/> 

</project> 

उत्पादन, कोई त्रुटि लेकिन macrodef निष्पादित हो नहीं करता है:

[echo] Apache Ant(TM) version 1.9.1 compiled on May 15 2013 
BUILD SUCCESSFUL 

लगता है कि अभी भी उस क्षेत्र में कुछ विसंगतियां हैं की तरह, के रूप में इस सुविधा नई पिटाई कर रहा है।
शायद हमें एक बग फाइल करना चाहिए!
- EDIT (1) -
बस मैकोडेफ़ के साथ एक स्निपेट प्रदान करने वाले एंटी बग डेटाबेस में comment from 2007 by Peter Reilly (उसने सुविधा/जब तक सुविधा लागू नहीं की है) पाया।

- संपादित करें (2) -
हालांकि 29 दिसंबर, 2013 (see releasenotes here) से नए चींटी रिलीज 1.9.3 करने के लिए करता है, तो नए संबंधित एक बग तय: और जब तक: विशेषताएं (https://issues.apache.org/bugzilla/show_bug.cgi?id=55885) हमारी समस्या अभी भी बना हुआ । इस प्रकार मैंने एक बग रिपोर्ट खोली, एंट बग डेटाबेस bugid 55971 देखें।

- EDIT (3) -
अंत में समाधान मिल गया है। Bugid 55885 एंटी रिलीज 1.9 के लिए बगफिक्स के बगल में।3 नए दस्तावेज के लिए एक बगफिक्स भी प्रदान करता है यदि: और जब तक: विशेषता =>Bugid 55359 दिखा रहा है कि if:true="propertyname" के बजाय उपयोग किया जाना है।
तो अपने मैक्रो उस तरह चींटी 1.9.3 पर अपग्रेड करने के बाद काम करना चाहिए:

<property name="test.templates"  value="true"/> 
.... 
<target name="test.templates" 
description="Test the autoconfiguration templates and answers"> 
    <test.templates 
    if:true="${test.templates}" 
    template.root.dir="${main.dir}" 
    answers.dir="${main.config.dir}"/> 
</target> 
+0

आपके द्वारा किए गए सभी कार्यों के लिए धन्यवाद! हम antcontrib के ' 'का उपयोग कर रहे थे, लेकिन मैंने सोचा कि यह समस्या को संभालने का एक और शानदार तरीका होगा, लेकिन जब यह काम नहीं करता था तो आश्चर्यचकित था। –

+0

@Rebse: अगर आप इस जवाब को नीचे के बजाय शीर्ष पर समाधान (कई गैर-समाधानों के तहत) डालने के लिए संपादित करते हैं तो यह अच्छा होगा। अगर आपके लिए नहीं "मैंने इसे हल किया!" सवाल पर टिप्पणी, मैं अंत तक पहुंचने से पहले अपने उत्तर पर छोड़ दिया होगा। –

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