चींटी लक्ष्य को चींटी लक्ष्य चलाने के लिए केवल एक फ़ाइल मौजूद है?


153

क्या कोई ANT टास्क है जो किसी दिए गए फ़ाइल के मौजूद होने पर ही किसी ब्लॉक को निष्पादित करेगा? मेरे पास समस्या है कि मेरे पास एक सामान्य चींटी स्क्रिप्ट है जिसे कुछ विशेष प्रसंस्करण करना चाहिए लेकिन केवल अगर कोई विशिष्ट कॉन्फ़िगरेशन फ़ाइल मौजूद है।


जवाबों:


200

उपलब्ध और शर्त

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 

8
उपलब्ध यह क्या करता है के लिए एक गैर इतना स्पष्ट नाम है। मैं इस तथ्य से और अधिक भ्रमित हो गया कि Google अपने स्वयं के टैग लिखने वाले लोगों को दिखाता है
मारियो ऑर्टगॉन

यह काम कर सकता है, लेकिन अगर आप बड़ी संख्या में फाइलों पर आवेदन करना चाहते हैं, तो यह एक अच्छा समाधान नहीं लगता है
cmcginty

4
यदि कोई आश्चर्यचकित होता है, ifऔर unlessविशेषताएँ केवल उस लक्ष्य को सक्षम या अक्षम करती हैं, जो वे संलग्न हैं, अर्थात लक्ष्य की निर्भरता हमेशा निष्पादित होती है। अन्यथा यह उस लक्ष्य पर निर्भर करने के लिए काम नहीं करेगा जो आपके द्वारा जाँची जा रही संपत्ति को निर्धारित करता है।
sschuberth

ऐसा लगता है <Available>कि पदावनत किया गया है। : मैं इस का उपयोग किया है <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> : जांच nant.sourceforge.net/release/0.85/help/functions/...
Loïc

1
@ Lo @c 1: जहां यह कहा गया है कि <available>पदावनत किया गया है? 2: ${file::existst...} लगता है कि चींटी (Apache ANT 1.9.7) के साथ काम नहीं कर रहा है
user85421

123

यह एक कोडिंग परिप्रेक्ष्य (एंट-कंट्रीब के साथ उपलब्ध: http://ant-contrib.sourceforge.net ) से थोड़ा अधिक समझ में आ सकता है :

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>

36
यह केवल एंटी-कंट्रीब मुझे लगता है में उपलब्ध है।
रिचर्ड कुक

26

चींटी 1.8.0 के बाद से जाहिर तौर पर रिसोर्सएक्सिस्ट भी हैं

से http://ant.apache.org/manual/Tasks/conditions.html

अस्तित्व के लिए एक संसाधन का परीक्षण करता है। चींटी 1.8.0 के बाद से

परीक्षण करने के लिए वास्तविक संसाधन एक नेस्टेड तत्व के रूप में निर्दिष्ट है।

एक उदाहरण:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

मैं इस प्रश्न के उपरोक्त अच्छे उत्तर से उदाहरण को फिर से बनाने के बारे में था, और फिर मुझे यह मिला

चींटी 1.8.0 के रूप में, आप इसके बजाय संपत्ति विस्तार का उपयोग कर सकते हैं; सही (या पर या हाँ) का मान मद को सक्षम करेगा, जबकि असत्य (या बंद या नहीं) इसे अक्षम कर देगा। अन्य मूल्यों को अभी भी संपत्ति के नाम माना जाता है और इसलिए आइटम को केवल तभी सक्षम किया जाता है जब नामित संपत्ति को परिभाषित किया जाता है।

पुरानी शैली की तुलना में, यह आपको अतिरिक्त लचीलापन देता है, क्योंकि आप कमांड लाइन या मूल स्क्रिप्ट से स्थिति को ओवरराइड कर सकते हैं:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

चींटी मैनुअल से http://ant.apache.org/manual/properties.html#if+unless पर

उम्मीद है कि यह उदाहरण कुछ के लिए उपयोग का है। वे रिसोर्सएक्सिस्ट का उपयोग नहीं कर रहे हैं, लेकिन संभवतः आप कर सकते हैं? ...


2
ध्यान दें कि if="${file.exists}"साथ प्रतिस्थापित किया जाना चाहिए if="file.exists"के रूप में ifऔर unless, नहीं यह मूल्य नाम से संपत्ति का केवल अस्तित्व की जाँच करें।
वडज़िम

1
@Vadzim जैसा कि उल्लेख किया गया है, यह केवल चींटी 1.8 में काम करता है, और 1.8 संपत्ति के विस्तार का समर्थन करता है। ant.apache.org/manual/properties.html#if+unless
डैनियल यांकोव्स्की

12

मुझे लगता है कि यह इसी तरह के जवाब को संदर्भित करने के लायक है: https://stackoverflow.com/a/5288804/64313

यहाँ एक और त्वरित समाधान है। <available>टैग का उपयोग करके इस पर अन्य विविधताएं संभव हैं :

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>

3

जैसे फ़ाइल नाम फ़िल्टर का उपयोग करके जाँच करें DB_*/**/*.sql

यदि किसी वाइल्डकार्ड फ़िल्टर के लिए एक या अधिक फ़ाइलें मौजूद हैं, तो एक क्रिया करने के लिए यहां भिन्नता है। यही है, आप फ़ाइल का सही नाम नहीं जानते हैं।

यहां, हम " DB_ * नामक किसी भी उप-निर्देशिका में " * .sql "फ़ाइलों की तलाश कर रहे हैं " पुनरावृत्ति के लिए देख रहे हैं। आप अपनी आवश्यकताओं के लिए फ़िल्टर समायोजित कर सकते हैं।

NB: अपाचे चींटी 1.7 और उच्चतर!

यदि फ़ाइलों से मेल खाती है तो यहां संपत्ति सेट करने का लक्ष्य है:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

यहाँ एक "सशर्त" लक्ष्य है जो केवल तभी चलता है जब फ़ाइलें मौजूद होती हैं:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>

0

आप इसे फाइलों की एक सूची के साथ ऑपरेशन करने का आदेश देकर कर सकते हैं, जिनके नाम की आवश्यकता है। यह एक विशेष लक्ष्य बनाने की तुलना में बहुत आसान और प्रत्यक्ष है। और आपको किसी भी अतिरिक्त उपकरण की आवश्यकता नहीं है, बस शुद्ध चींटी।

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

देखें: फ़ाइलसेट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.