2012-02-09 10 views
30

में किसी संपत्ति का मूल्य कैसा है या नहीं, मेरे पास एक एंटी एक्सएमएल फ़ाइल है जिसका उपयोग मैं निर्माण के लिए करता हूं।एंट

मेरे पास 3 गुण हैं। यदि बिल्ड में इन मानों में कोई मूल्य नहीं है तो मैं बिल्ड को तोड़ना चाहता हूं। यदि मूल्य खाली है तो मैं बिल्ड को तोड़ना चाहता हूं।

मैं चींटी में यह कैसे कर सकता हूं?

मैं चींटी का उपयोग कर रहा हूं और एंटी-कॉन्ट्रिब नहीं।

+0

संभव डुप्लिकेट - (http://stackoverflow.com/questions/226683/ant-filtering-fail-if-property-not-set) – oers

उत्तर

52

आप <fail> कार्य का उपयोग कर शर्तों का उपयोग कर सकते हैं:

<fail message="Property &quot;foo&quot; needs to be set to a value"> 
    <condition> 
     <or> 
      <equals arg1="${foo}" arg2=""/> 
      <not> 
       <isset property="foo"/> 
      </not> 
     </or> 
    </condition> 

यह बराबर है if (not set ${foo} or ${foo} = "") कह करने के लिए स्यूडोकोड है। आपको अंदरूनी एक्सएमएल स्थितियों को पढ़ना होगा।

<fail> कार्य पर आप <unless> क्लॉज का उपयोग कर सकते थे अगर आप केवल यह सुनिश्चित करते हैं कि चर सेट किया गया था या नहीं, और यह नहीं कि इसका वास्तविक मूल्य है या नहीं।

<fail message="Property &quot;foo&quot; needs to be set" 
    unless="foo"/> 

बहरहाल, यह असफल नहीं हो संपत्ति सेट है, लेकिन कोई मूल्य नहीं है यदि।


एक चाल है कि इस सरल

<!-- Won't change the value of `${foo}` if it's already defined --> 
<property name="foo" value=""/> 
<fail message="Property &quot;foo&quot; has no value"> 
    <condition> 
      <equals arg1="${foo}" arg2=""/> 
    </condition> 
</fail> 

याद रखें कि मैं एक संपत्ति रीसेट नहीं कर सकते कर सकते हैं नहीं है! यदि ${foo} में पहले से ही एक मान है, तो ऊपर दिए गए <property> कार्य कुछ भी नहीं करेगा। इस तरह, मैं <isset> स्थिति को खत्म कर सकता हूं।यह अच्छा है क्योंकि आप तीन गुण होते हैं हो सकता है: अन्य उत्तर पर

<property name="foo" value=""/> 
<property name="bar" value=""/> 
<property name="fubar" value=""/> 
<fail message="You broke the build, you dufus"> 
    <condition> 
     <or> 
      <equals arg1="${foo}" arg2=""/> 
      <equals arg1="${bar}" arg2=""/> 
      <equals arg1="${fubar}" arg2=""/> 
     </or> 
    </condition> 
</fail> 
+0

टैंक [चींटी छानने अगर गुण सेट नहीं असफल]। मेरे लिए बहुत अच्छा काम करता है – KK99

+0

नेस्टेड आईएफएस से बचने के लिए यह अच्छा है। इसके अलावा स्थिति संपत्ति और मूल्य निर्धारित किया जा सकता है। – user1587504

+0

महान जवाब! मैंने देखा कि आखिरी असफल वक्तव्य में एक उचित समापन टैग गुम है -> स्लैश गुम है और मैं इसे सही नहीं कर सकता क्योंकि संपादन को कम से कम 6 वर्णों को बदलने की आवश्यकता है: < – AgentKnopf

0

के साथ एक लक्ष्य बनाने Ant addon Flaka के साथ आप की तरह पैटर्न का उपयोग कर सकते की कोशिश कर सकते:

<fl:when test=" empty '${foo}' "> 
    <fail message="Houston we have a problem!!"/> 
</fl:when> 
: emptyness के लिए

<property name="foo" value="bar"/> 
... 
    <fl:unless test="has.property.foo"> 
    ... 
    </fl:unless> 
... 
    <fl:when test="has.property.foo"> 
    ... 
    </fl:when> 

कंक्रीट की जांच

एक पूर्ण उदाहरण, कुछ इक्विल्स का उपयोग 'eq' के साथ चेक (विपरीत wo

<project xmlns:fl="antlib:it.haefelinger.flaka"> 
    <!-- some if/then/else construct --> 
    <fl:choose> 
    <!-- if --> 
    <when test=" '${buildtype}' eq 'prod' "> 
     <!-- then --> 
     <echo>..starting ProductionBuild</echo> 
    </when> 
    <when test=" '${buildtype}' eq 'test' "> 
     <!-- then --> 
     <echo>..starting TestBuild</echo> 
    </when> 
    <!-- else --> 
    <otherwise> 
     <fl:unless test="has.property.dummybuild"> 
     <fail message="No valid buildtype !, found => '${buildtype}'"/> 
     </fl:unless> 
     <echo>.. is DummyBuild</echo> 
    </otherwise> 
    </fl:choose> 
</project> 

चींटी -f build.xml -Dbuildtype = prod
या
चींटी -f build.xml -Dbuildtype = prod -Ddummybuild = जो कुछ

[echo] ..starting ProductionBuild 
साथ उत्पादन: 'neq') हो uld

टाइपो साथ उत्पादन => चींटी - build.xml -Dbuildtype = testt चींटी -f build.xml -Dd साथ

BUILD FAILED 
/home/rosebud/workspace/AntTest/build.xml:21: No valid buildtype !, found => 'testt' 

उत्पादन ummybuild = जो कुछ

[echo] .. is DummyBuild 
12

बिल्डिंग, यह मेरा पसंदीदा रूप है, एक मैक्रो के रूप में:

<target name="deploy.war" description="Do the war deployment ;)"> 
    <prop-require prop="target.vm" /> 
    <prop-require prop="target.vip" /> 
    <!-- ... --> 
:

<!-- Macro to require a property is not blank --> 
<macrodef name="prop-require"> 
    <attribute name="prop"/> 
    <sequential> 
     <fail message="Property &quot;@{prop}&quot; must be set"> 
      <condition> 
       <not> 
        <isset property="@{prop}"/> 
       </not> 
      </condition> 
     </fail> 

     <fail message="Property &quot;@{prop}&quot; must not be empty"> 
      <condition> 
       <equals arg1="${@{prop}}" arg2=""/> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

के रूप में प्रयोग की जाने वाली

ब्रेवटी के लिए आप <or> का उपयोग करके दो असफल तत्वों को एक में पतन कर सकते हैं, लेकिन मैं अपने त्रुटि संदेशों को मुझसे इलाज करने के लिए पसंद करता हूं जैसे कि मैं खुद के लिए नहीं सोच सकता;)

0

मैं चींटी के पुराने संस्करण पर हूं, इसलिए जारीकर्ता उपलब्ध नहीं था। इसके बजाय मैंने बराबर में डबल $ के साथ निम्नलिखित नोटेशन का उपयोग किया। की

<target name="xxx"> 
     <echo message="${contextRoot}" /> 
     <if> 
      <!-- check if the contextRoot property is defined. --> 
      <equals arg1="${contextRoot}" arg2="$${contextRoot}" /> 
      <then> 
       <!-- it isn't set, set a default --> 
       <property name="contextRoot" value="/WebAppCtx" /> 
      </then> 
     </if> 
     <echo message="${contextRoot}" /> 
    </target> 
संबंधित मुद्दे