2009-12-08 10 views

उत्तर

11

संशोधित संपत्ति का उपयोग करने के तरीके के आधार पर, आप macrodef एस का उपयोग कर सकते हैं।

उदाहरण के लिए

, लिखने की बजाय निम्नलिखित:

<target name="foo"> 
    <echo message="${my_property}"/> 
</target> 

और एक अन्य संदेश के साथ ant foo कॉल करने के लिए सक्षम नहीं होने के लिए, आप लिख सकते हैं:

<macrodef name="myecho"> 
    <attribute name="msg"/> 
    <sequential> 
     <echo message="@{msg}"/> 
    </sequential> 
</macrodef> 

<target name="foo"> 
    <myecho msg="${my_property}"/> 
    <property name="my_property2" value="..."/> 
    <myecho msg="${my_property2}"/> 
</target> 
33

ant-contrib'sVariable कार्य कर सकते हैं:

<property name="x" value="6"/> 
<echo>${x}</echo> <!-- will print 6 --> 
<var name="x" unset="true"/> 
<property name="x" value="12"/> 
<echo>${x}</echo> <!-- will print 12 --> 

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

+2

var कार्य "स्थानीय चर" के लिए विशेष रूप से अच्छा है, उदाहरण के लिए लूप के लिए (उत्कृष्ट चींटी-contrib से भी एक कार्य)। हालांकि, एक दोष यह है कि var कार्य "स्थान" विशेषता का समर्थन नहीं करता है। – akr

10

गुण चींटी में अपरिवर्तनीय हैं।

आपको ant-contrib के var task में रुचि हो सकती है।

<var name="my_var" value="${my_property}" /> 

<echo>Addressed in the same way: ${my_var} and ${my_property}</echo> 
2

गुण चींटी में अपरिवर्तनीय हैं। लेकिन यह उतना ही भयानक नहीं है जितना लगता है। प्रोग्रामिंग भाषाओं की एक पूरी कक्षा है जहां (अधिकतर) चर स्थिर हैं और फिर भी वे   पर सामान प्राप्त करते हैं इसे "कार्यात्मक प्रोग्रामिंग" कहा जाता है।

आप subant या antcall कार्यों के साथ कार्यों को कॉल करते समय नए, बदले गए गुणों को पुराने, या पैरामीटर बदलकर विभिन्न कार्यों द्वारा उपयोग किए गए मानों को "बदल सकते हैं" कर सकते हैं। यदि आप रचनात्मक हैं तो आप आमतौर पर अपनी समस्या का समाधान करने का एक तरीका ढूंढ सकते हैं।

+1

यदि आप एक उदाहरण देते हैं और अधिक समझाते हैं तो यह बहुत उपयोगी होता है। –

4

आप चींटी में किसी संपत्ति का मूल्य नहीं बदल सकते हैं।

यदि आपके पास कुछ चींटी कार्य हैं जो आप बार-बार अलग-अलग मानों में गुजरना चाहते हैं तो मैं macrodef task की अनुशंसा करता हूं क्योंकि आप अलग-अलग गुणों में बार-बार वही मैक्रो चला सकते हैं।

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

<macrodef name="copythings"> 
    <attribute name="todir"/> 
    <sequential> 
    <copy todir="@{todir}"> 
     <fileset dir="${src}"> 
     <exclude name='**/*svn' /> 
     </fileset> 
    </copy> 
    </sequential> 
</macrodef> 

<copythings todir="/path/to/target1"/> 
<copythings todir="/path/to/target2"/> 

ध्यान दें कि ${property} गुण संदर्भित करने के लिए प्रयोग किया जाता है और @{attribute} विशेषताओं <macrodef> कार्य करने के लिए पारित कर दिया संदर्भित करने के लिए प्रयोग किया जाता है।

8

चींटी 1.8 के बाद से, आप उपयोग कर सकते हैं एक लक्ष्य के भीतर किसी संपत्ति के मूल्य को बदलने के लिए "स्थानीय" कार्य। ध्यान दें कि यह वैश्विक संपत्ति के मूल्य को उसी नाम से नहीं बदलता है लेकिन यह कुछ समस्याओं को हल करने का एक तरीका है।

देखें

http://ant.apache.org/manual/Tasks/local.html

20

न्याय के लिए, वहाँ एक हैक है कि किसी भी अतिरिक्त libs बिना चींटी के अपरिवर्तनीय विशेषताओं को परिवर्तित करने की अनुमति देता है (के बाद से जावा 6):

<scriptdef name="propertyreset" language="javascript" 
    description="Allows to assign @{property} new value"> 
    <attribute name="name"/> 
    <attribute name="value"/> 
     project.setProperty(attributes.get("name"), attributes.get("value")); 
</scriptdef> 

उपयोग:

<property name="x" value="10"/> 
    <propertyreset name="x" value="11"/> 
    <echo>${x}</echo> <!-- will print 11 --> 

जैसा कि अन्य लोगों ने उल्लेख किया है, यह होना चाहिए सभी कैनोलिक दृष्टिकोण फिट होने के बाद साबित होने के साथ सावधानी बरतें।

0

यहां बेसनाम कमांड के साथ स्थानीय का उपयोग करके एक नमूना है। Var-unset मेरे लिए काम नहीं करता है।

<for param="db-patches"> 
     <path> 
      <fileset dir="${undeployed-files}" includes="**/ddl*.zip"/> 
     </path> 
     <sequential> 
       <local name="inpfile" /> 
       <basename property="inpfile" file="@{db-patches}" suffix=".zip" /> 
       <!-- unzip the patch --> 
       <unzip src="${undeployed-files}/${inpfile}.zip" 
        dest="${unzipped-patches}/${inpfile}" /> 
      <move file="${undeployed-files}/${inpfile}.zip" tofile="${deployed-files}/${inpfile}.zip"/> 
     </sequential> </for> 
संबंधित मुद्दे