2009-09-24 25 views
18

Đoạn mã buildfile Ant bên dưới là một nỗ lực để đơn giản xuất ra thời gian trước và sau mỗi tập lệnh sql được chạy. Tôi không thể thay đổi cấu trúc của các mục tiêu Ant (các bảng tạo phải gọi run-sql-script giống như nó). Vấn đề là các thuộc tính (thời gian và thời gian 2) là không thay đổi (http://ant.apache.org/manual/Tasks/property.html) và do đó chỉ có thời gian hoạt động đầu tiên và không phải là lần thứ hai. Không có cách nào để làm những gì tôi đang cố gắng làm trong Ant?Xuất một số dấu thời gian trong ant

<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> 

Trả lời

10

Sử dụng một nhiệm vụ <macrodef> cùng với nhiệm vụ <local> (giới thiệu trong 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

Cập nhật: Bạn có thể dùng antcall để gọi tác vụ và tạo/echo dấu thời gian mới trong phạm vi cuộc gọi đó.

Ví dụ này cho thấy làm thế nào để vượt qua một thông điệp tới các cuộc gọi và echo dấu thời gian hiện tại với một thông điệp:

<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> 

Sản lượng khi điều này được tiến hành như sau:

test: 

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

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

@ Rich - bạn đã thay đổi những gì? sự khác biệt giữa bản gốc của Aaron và sự thay đổi của bạn là gì? – andersonbd1

+2

@ andersonbd1, trong trường hợp đầu tiên macrodef sẽ đặt thuộc tính có dấu thời gian, khi dấu thời gian được đặt, nó được sử dụng ở mọi nơi trong bản dựng với giá trị ban đầu. Trong phiên bản thứ hai, biến timestamp là phạm vi cho cuộc gọi bên trong, do đó sẽ có một giá trị mới mỗi lần –

2

Tôi thấy rằng nếu bạn sử dụng nó như một macro thay vì một mục tiêu ant, nó hoạt động tốt hơn vì nó không lặp thông qua các file ant từ đầu mỗi khi bạn làm một antcall target= (ít kiểm tra nếu bạn có phụ thuộc và bộ tài sản).

<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

Điều này sẽ hiển thị cùng một dấu thời gian mỗi lần – Slav

10

Tôi thích giải pháp macrodef nếu thực sự nó là hiệu quả hơn so với mục tiêu một, nhưng tôi sử dụng một var unset=true để buộc một cài đặt lại của biến, như:

<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> 

Cách sử dụng

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

Lưu ý rằng tác vụ 'var' không phải từ lõi kiến, nhưng [ant-contrib] (http://ant-contrib.sourceforge.net/). – zb226

10

Theo sau từ câu trả lời của @ Niek, chúng tôi có thể tạo macro hoạt động như tiếng vọng nhưng có dấu thời gian

<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> 

mà sẽ cung cấp sản lượng

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

Một lợi thế khi sử dụng macrodef là bạn không làm lộn xộn đầu ra với tên của đích timestamp2. Đầu ra trông giống như một thông điệp echo được chú thích. –

Các vấn đề liên quan