2009-09-24 8 views
18

में कई टाइमस्टैम्प आउटपुट नीचे एंट बिल्डफाइल स्निपेट प्रत्येक एसक्यूएल स्क्रिप्ट चलाने से पहले और बाद में समय को आउटपुट करने का प्रयास है। मैं चींटी लक्ष्यों की संरचना को नहीं बदल सकता (बनाने-सारणी को रन-एसक्यूएल-स्क्रिप्ट को कॉल करना चाहिए)। समस्या यह है कि गुण (समय और समय 2) अपरिवर्तनीय (http://ant.apache.org/manual/Tasks/property.html) हैं और इस प्रकार केवल पहला ऑपरेशन है और दूसरा नहीं। क्या मैं ऐसा करने का कोई तरीका नहीं हूं जिसे मैं चींटी में करने की कोशिश कर रहा हूं?आउटपुट एंटी

<target name="create-tables"> 
    <antcall target="run-sql-script"> 
     <param name="db.script" value="teams.sql"/> 
    </antcall> 

    <!-- Create the base UDM schema. --> 
    <antcall target="run-sql-script"> 
     <param name="db.script" value="players.sql"/> 
    </antcall> 
    </target> 
    <target name="run-sql-script"> 
    <tstamp> 
     <format property="time" pattern="MM/dd/yyyy hh:mm:ss aa" 
      offset="-5" unit="hour"/> 
    </tstamp> 
    <echo>before: ${time}</echo> 
    <sql 
     classpath="${classpath}" 
     driver="${db.driver}" 
     url="${db.url}" 
     userid="${db.userid}" 
     password="${db.password}" 
     src="${script.dir}/${db.script}" 
     delimiter="${script.delimiter}" 
     onerror="abort"> 
    </sql>    
    <tstamp> 
     <format property="time2" pattern="MM/dd/yyyy hh:mm:ss aa" 
      offset="-5" unit="hour"/> 
    </tstamp> 
    <echo>after: ${time2}</echo> 
    </target> 

उत्तर

10

<local> कार्य के साथ एक साथ एक <macrodef> कार्य का उपयोग दे देंगे (चींटी 1.8 में शुरू की गई):

<macrodef name="echotimestamp"> 
    <sequential> 
    <local name="timestamp" /> 
    <tstamp> 
     <format property="timestamp" pattern="yyyy-MM-dd HH:mm:ss" /> 
    </tstamp> 
    <echo message="${timestamp}" /> 
    </sequential> 
</macrodef> 
<echotimestamp /> 
31

अद्यतन: आप एक काम आह्वान करने के लिए एक antcall उपयोग कर सकते हैं, और कहा कि कॉल के दायरे के भीतर एक नया टाइमस्टैम्प गूंज बनाने /।

यह उदाहरण दिखाता है कि कॉल करने के लिए एक संदेश भेज देंगे और एक संदेश के साथ वर्तमान टाइमस्टैम्प प्रतिध्वनित करने के लिए:

<target name="timestamp2"> 
    <tstamp> 
    <format property="current.time" pattern="MM/dd/yyyy hh:mm:ss aa" /> 
    </tstamp> 

    <echo message="${message} ${current.time}" />  
</target> 

<target name="test"> 
    <antcall target="timestamp2"> 
    <param name="message" value="hello" /> 
    </antcall> 

    <sleep seconds="5"/> 

    <antcall target="timestamp2"> 
    <param name="message" value="world" /> 
    </antcall> 
</target> 

उत्पादन जब यह चलती है:

test: 

timestamp2: 
    [echo] hello 09/24/2009 05:33:22 PM 

timestamp2: 
    [echo] world 09/24/2009 05:33:24 PM 
+0

@Rich - तुम क्या बदल दिया? हारून के मूल और आपके परिवर्तन के बीच क्या अंतर था? – andersonbd1

+2

@ andersonbd1, पहले उदाहरण में मैक्रोडेफ़ टाइमस्टैम्प के साथ एक संपत्ति सेट करेगा, टाइमस्टैम्प सेट होने के बाद इसे मूल मूल्य के साथ निर्माण में हर जगह उपयोग किया जाता है। दूसरे संस्करण में टाइमस्टैम्प वैरिएबल को आंतरिक कॉल पर स्कॉप्ड किया जाता है, इसलिए –

2

मैंने पाया कि अगर आप इसे चींटी लक्ष्य की बजाय मैक्रो के रूप में उपयोग करते हैं, यह बेहतर काम करता है क्योंकि यह हर बार antcall target= (यदि आपके पास निर्भरता और संपत्ति सेट हैं तो कम जांच करें) से शुरुआत से चींटी फ़ाइल के माध्यम से लूप नहीं होता है।

<target name="testMe"> 
    <MyTimestamp></MyTimestamp> 
    <sleep seconds="5"></sleep> 
    <MyTimestamp></MyTimestamp> 
</target> 

<macrodef name="MyTimestamp"> 
    <sequential > 
     <tstamp> 
      <format property="current.time" pattern="MM/dd/yyyy hh:mm:ss aa"/> 
     </tstamp> 
     <echo message="RUN_TIME: ${current.time}"/> 
    </sequential> 
</macrodef> 
+2

प्रत्येक बार एक नया मान होगा, यह हर बार – Slav

10

मैं macrodef समाधान चाहते है, तो वास्तव में यह लक्ष्य एक से अधिक कुशल है, लेकिन मैं एक var unset=true का उपयोग चर का एक रीसेट के लिए मजबूर करने की तरह है,:

<macrodef name="echoTimestamp"> 
    <sequential> 
     <var name="current.time" unset="true"/> 
     <tstamp> 
      <format property="current.time" pattern="yyyy-MM-dd HH:mm:ss" /> 
     </tstamp> 
     <echo message="${current.time}" /> 
    </sequential> 
</macrodef> 

प्रयोग

<echoTimestamp /> 
<sleep seconds="3"/> 
<echoTimestamp /> 
+0

पर एक ही टाइमस्टैम्प प्रदर्शित करता है ध्यान दें कि 'var' कार्य मुख्य चींटी से नहीं है, लेकिन [ant-contrib] (http://ant-contrib.sourceforge.net/)। – zb226

10

@ निइक के उत्तर से निम्नलिखित के बाद, हम एक मैक्रो बना सकते हैं जो गूंज की तरह व्यवहार करता है लेकिन एक समय स्टैम्प

<macrodef name="echoTS"> 
    <attribute name="message"/> 
    <sequential> 
    <var name="current.time" unset="true"/> 
    <tstamp><format property="current.time" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> 
    <echo message="${current.time}> @{message}" /> 
    </sequential> 
</macrodef> 

<target name="test-timestamp"> 
    <echoTS message="hi" /> 
</target> 

जो उत्पादन

test-timestamp: 
    [echo] 2013-05-03 12:02:38> hi 
+0

मैक्रोडेफ़ का उपयोग करने का एक फायदा यह है कि आप टाइमस्टैम्प 2 लक्ष्य के नाम से आउटपुट को अव्यवस्थित नहीं करते हैं। आउटपुट सिर्फ एक एनोटेटेड गूंज संदेश की तरह दिखता है। –