2011-01-27 12 views
12

मैं मेजबान अधिलेखित करना चाहते हैं Windows मशीन पर फ़ाइल उपयोगकर्ता की अनुमति देता है अगर यह:चींटी: सशर्त कॉपी

<input message="Do you want to overwrite the HOSTS file?" 
     addproperty="overwrite.hosts" validargs="yes,no" /> 

<copy tofile="${env.WINDIR}/system32/drivers/etc/hosts.backup"> 
    <fileset file="${env.WINDIR}/system32/drivers/etc/hosts" /> 
</copy> 

<copy todir="${env.WINDIR}/system32/drivers/etc"> 
    <fileset file="${trainer.dir}/hosts" /> 
</copy> 

मैं प्रतियां करना कैसे करते उपयोगकर्ता कहते हैं केवल यदि हाँ?

संपादित करें:

मैं इस कोशिश की:

<input message="Do you want to overwrite the HOSTS file?" addproperty="overwrite.hosts" validargs="yes,no" /> 

    <if> 
     <equals arg1="${overwrite.hosts}" arg2="yes" /> 
     <then> 
      <copy tofile="${env.windir}/system32/drivers/etc/hosts.backup"> 
       <fileset file="${env.windir}/system32/drivers/etc/hosts"> 
       </fileset> 
      </copy> 

      <copy todir="${env.windir}/system32/drivers/etc"> 
       <fileset file="${trainer.dir}/hosts"> 
       </fileset> 
      </copy> 
     </then> 
    </if> 

और मैं इस उत्पादन प्राप्त करें:

C:\trainer\build.xml:16: 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. 

मैं एक चींटी रूकी हूँ ... मुझे क्या करना चाहिए?

उत्तर

7

आप लक्ष्य पर "if" पैरामीटर का उपयोग कर संपत्ति पर सशर्त बनाने के लिए इसका उपयोग कर सकते हैं।

मैंने कभी भी "इनपुट" कार्य का उपयोग नहीं किया है - मुझे नहीं पता था कि यह अभी तक अस्तित्व में है (सिर के लिए धन्यवाद!) - लेकिन दस्तावेज़ीकरण पर एक त्वरित रूप से संकेत मिलता है कि यह नामित संपत्ति सेट करता है दर्ज मूल्य के लिए, यानी "इनपुट" के बाद संपत्ति हमेशा सेट होती है। तो मुझे लगता है कि आपको मूल्य का परीक्षण करने और सेट करने या कुछ अन्य संपत्ति सेट करने के लिए "शर्त" की आवश्यकता होगी।

ऐसा कुछ। मैंने बस एक त्वरित परीक्षण चलाया और यह काम करता है। अर्थात्, यदि आप "y" प्रश्न का उत्तर देते हैं तो यह संदेश प्रिंट करता है, और यदि आप "n" का उत्तर देते हैं तो ऐसा नहीं होता है।

<project name="test" default="do.whatever"> 
    <target name="decide.do.whatever"> 
    <input message="So you wanna do this or not?" validargs="y,n" addproperty="wanna"/> 
    <condition property="wanna.yes"> 
     <equals arg1="${wanna}" arg2="y"/> 
    </condition> 
    </target> 
    <target name="do.whatever" depends="decide.do.whatever" if="wanna.yes"> 
    <echo message="Yeah he wannas."/> 
    </target> 
</project> 
+0

मुझे एक और लक्ष्य बनाना है। यह हर सशर्त काम के लिए है, मुझे इसका परीक्षण करना है, फिर संपत्ति सेट करें और नया लक्ष्य बनाएं जो सेट संपत्ति पर कॉल किया जाएगा? कोई अन्य तरीका ? –

+0

हां, बिल्कुल, यदि आप अलग-अलग स्थानों से अलग-अलग फाइलों का एक समूह कॉपी करते हैं और आप केवल कुछ फाइलों की प्रतिलिपि बनाना चाहते हैं, लेकिन दूसरों को नहीं ... आपको कार्यों के एक ही सेट के साथ अनावश्यक लक्ष्य की आवश्यकता है, यह तय करने के लिए लक्ष्य के अंदर शर्त बनाम कॉल करने के लिए या नहीं – sloven

9

आप इसके लिए condition या if task का उपयोग कर सकते हैं। (उत्तरार्द्ध ant-contrib प्रोजेक्ट का हिस्सा है।)

+1

वास्तव में स्थिति कार्य नहीं है। –

+2

लंबे समय तक चींटी का उपयोग नहीं किया है, इसलिए मुझे नामकरण के बारे में निश्चित नहीं था, लेकिन वास्तव में दस्तावेज़ों 'स्थिति' में कार्यों के तहत दिखाई दिया (http://ant.apache.org/manual/Tasks/)। इसके लिए – miku