2009-09-24 68 views
18

下面的Ant構建文件片段試圖簡單地輸出每個sql腳本運行前後的時間。我無法更改Ant目標的結構(create-tables必須像調用run-sql-script一樣)。問題是屬性(時間和time2)是不可變的(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

一起使用<macrodef>任務與<local>任務(Ant中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 2009-09-25 14:35:15

+2

@ andersonbd1,在第一個實例中,macrodef將使用時間戳設置一個屬性,一旦時間戳被設置,它將在構建中的任何地方與原始值一起使用。在第二個版本中,timestamp變量的作用範圍爲內部調用,因此每次都會有一個新值。 – 2009-09-25 15:02:52

2

我發現如果你使用它作爲一個宏而不是一個螞蟻目標,它可以更好地工作,因爲每次你做一個antcall target=(少檢查你是否有依賴和屬性集),它不會從一開始就循環通過ant文件。

<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 2013-09-24 14:45:18

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,而是[ant-contrib] (http://ant-contrib.sourceforge.net/)。 – zb226 2017-08-04 09:20:14

10

接下來從@ Niek的回答中,我們可以構建一個宏,它的行爲像回聲但帶有時間戳

<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

使用macrodef的一個優勢是不會使用timestamp2目標的名稱混淆輸出。輸出看起來像一個帶註釋的回顯消息。 – 2015-02-16 16:02:22