2009-07-22 9 views
59

मैं चींटी का उपयोग कर फ़ोल्डर के अस्तित्व की जांच कैसे करूं?क्या मेरे पास चींटी में एक निर्देशिका के अस्तित्व की जांच करने का कोई तरीका है (फ़ाइल नहीं)?

हम एक फ़ाइल के अस्तित्व की जांच कर सकते हैं, लेकिन क्या हम एक फ़ोल्डर के लिए भी ऐसा ही कर सकते हैं?

उत्तर

90

आप available कार्य को "dir" पर सेट प्रकार के साथ उपयोग करते हैं।

उदाहरण के लिए:

<available file="${dir}" type="dir"/> 

सशर्त प्रसंस्करण करने के लिए मानक तरीका condition task के साथ है। नीचे दिए गए उदाहरण में, निर्देशिका चलने पर doFoo संदेश को प्रतिबिंबित करेगा, जबकि चल रहा है doBar संदेश को प्रतिबिंबित करेगा जब तक निर्देशिका मौजूद नहीं है।

dir.check लक्ष्य दोनों doFoo और दोबार के लिए आवश्यक है, यह सही या गलत उपलब्ध कार्य के परिणाम के आधार पर करने के लिए dir.exists संपत्ति सेट। DoFoo लक्ष्य केवल तभी चलाया जाएगा जब वह प्रोपरी सत्य पर सेट हो और डबर केवल तभी चलाएगा जब यह सेट न हो या गलत पर सेट न हो।

<?xml version="1.0"?> 
<project name="test" default="doFoo" basedir="."> 
    <property name="directory" value="c:\test\directory"/> 

    <target name="doFoo" depends="dir.check" if="dir.exists"> 
    <echo>${directory} exists</echo> 
    </target> 

    <target name="doBar" depends="dir.check" unless="dir.exists"> 
    <echo>${directory} missing"</echo> 
    </target> 

    <target name="dir.check"> 
    <condition property="dir.exists"> 
     <available file="${directory}" type="dir"/> 
    </condition> 
    </target> 
</project> 

Antelope, आप download page से एंटीलोप कार्यों डाउनलोड कर सकते हैं एक तो काम है कि प्रसंस्करण आसान बनाने के कर सकते हैं (और मुझे करने के लिए अधिक सहज ज्ञान युक्त) सहित अतिरिक्त कार्य, प्रदान करता है।

+1

लेकिन यह एक संपत्ति मूल्य को सत्य पर सेट करेगा। तो मुझे इस स्थिति की जांच कैसे करनी चाहिए। मेरा मतलब है "अगर"? –

+0

क्यों सत्यापन dir.check doFoo और doBar के बाद है? दूसरा रास्ता नहीं होना चाहिए? @ रिच विक्रेता –

29

यहां available तत्व को if परीक्षण में शामिल करने वाला एक छोटा सा उदाहरण है।

<!-- Test if a directory called "my_directory" is present --> 
<if> 
    <available file="my_directory" type="dir" /> 
    <then> 
    <echo message="Directory exists" /> 
    </then> 
    <else> 
    <echo message="Directory does not exist" /> 
    </else> 
</if> 

चेतावनी: यदि आप अपने ANT_HOME \ lib निर्देशिका में चींटी-contrib.jar जरूरत है अन्यथा आप if तत्वों के लिए पहुँच नहीं होगा, और अपनी स्क्रिप्ट इस त्रुटि के साथ विफल हो जाएगा:

Problem: failed to create task or type if 
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. 
मैक्रो

:

+2

मुझे इस समाधान की सादगी और अभिव्यक्ति पसंद है। एंटी-contrib.jar स्थापित करने के लिए अतिरिक्त भारी भारोत्तोलन के लायक था। –

8

यहाँ मेरी समाधान है, जो गुण की स्थापना और 'अगर' या 'जब तक' के साथ लक्ष्य का उपयोग की आवश्यकता नहीं है है

<macrodef name="assertDirAvailable"> 
    <attribute name="dir" /> 
    <sequential> 
     <fail message="The directory '@{dir}' was expected to be available but is not"> 
      <condition> 
       <not> 
        <available file="@{dir}" type="dir" /> 
       </not> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

उपयोग:

<assertDirAvailable dir="${dirToCheck}" /> 
+0

अच्छा! चींटी-contrib.jar से बचें जो एक अच्छी बात है। प्रक्रियात्मक के बजाय इसे घोषणात्मक रखता है। – cartland

+0

हालांकि सुधार: यह $ {artifactDir} नहीं होना चाहिए @ {artifactDir}। – cartland

+0

मैंने उस उपयोग उदाहरण को मेरी वास्तविक निर्माण स्क्रिप्ट से कॉपी किया जहां artifactDir मैक्रोडेफ़ में एक विशेषता थी। मैक्रोडेफ़ विशेषता के बजाए पैरामीटर पास करने के संभवतः अधिक सामान्य मामले में उपयोग उदाहरण को बदल दिया है। धन्यवाद! – bcody

1

चींटी 1.8 संस्करण का उपयोग कर मेरे समाधान, पुराने संस्करणों काम नहीं कर सकता कारण यदि/जब तक समर्थन नहीं $ {evalTrueOrFalse} सिंटेक्स।

<?xml version="1.0" encoding="UTF-8"?> 
<project name="DoMagic" default="build" basedir="."> 

<property environment="env" /> 
<property name="name" value="Do the ANT Magic" /> 
<property name="somedir" value="./must_exist_folder"/> 
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> 

<target name="doMagic" if="${dir.exists}"> 
    <echo message="Do the magic stuff" /> 
</target> 

<target name="doUsage" unless="${dir.exists}"> 
    <echo message="Do usage and help" /> 
</target> 

<target name="build"> 
    <echo message="Do the magic" /> 

    <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition> 
    <echo message="Folder found: ${dir.exists}" /> 
    <antcall target="doCustomize"></antcall> 
    <antcall target="doUsage"></antcall> 
</target> 

</project> 
  • चींटी 1.6 या जल्दी चींटी 1.7, काम नहीं करता है चींटी 1.8 रिहाई के लिए नवीनीकरण।
  • लक्ष्य अगर और जब तक सही/गलत
  • स्थिति विशेषता के लिए $ {var} सिंटेक्स का मूल्यांकन करता है और कुछ मूल्य, संपत्ति के लिए सेट है, तो उपलब्ध हालत झूठा था बिना यह चर सेट नहीं है जिम्मेदार बताते हैं। NotSet मान एक स्पष्ट झूठे मान के समान नहीं है।
  • कॉल किसी भी लक्ष्य को परिभाषित करता है लेकिन जब तक विशेषता है कि इसका वास्तव में चलाने

http://ant.apache.org/manual/properties.html#if+unless
[यदि/जब तक] चींटी 1.7.1 में और इससे पहले, इन विशेषताओं केवल संपत्ति के नाम हो सकता है अगर /। चींटी 1.8.0 के रूप में, आप इसके बजाय संपत्ति विस्तार का उपयोग कर सकते हैं। पुरानी शैली की तुलना में, यह आपको अतिरिक्त लचीलापन देता है।

0

यहां एक और दृष्टिकोण है, एंटी-contrib.jar का उपयोग किए बिना केवल एक कार्य को कॉल करने की अनुमति देता है।

<target name="my-task" depends="dir-check"> 
    <antcall target="my-task-install"/> 
    <antcall target="my-task-update"/> 
</target> 
<target name="my-task-install" unless="dir.exists" > 
    {some task} 
</target> 
<target name="my-task-update" if="dir.exists" > 
    {another task} 
</target> 
<target name="dir-check"> 
    <condition property="dir.exists"> 
     <available file="my-dir" type="dir" /> 
    </condition> 
</target> 
संबंधित मुद्दे

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