2009-09-24 11 views
18

Poniższy fragment pliku kompilacji Ant jest próbą wyprostowania czasu przed i po uruchomieniu każdego skryptu sql. Nie mogę zmienić struktury celów Ant (tabele tworzenia muszą wywoływać skrypt run-sql, tak jak to robi). Problem polega na tym, że właściwości (czas i czas2) są niezmienne (http://ant.apache.org/manual/Tasks/property.html), a zatem tylko czas pierwszej operacji, a nie drugi. Czy nie ma sposobu, aby zrobić to, co próbuję zrobić w Ant?Wypisz kilka znaczników czasu w 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> 

Odpowiedz

10

użyć <macrodef> zadanie razem z zadaniem <local> (wprowadzone w 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

Aktualizacja: Można użyć antcall powołać zadania i tworzyć/echo nowej datownik w zakresie tej samej rozmowy.

Ten przykład pokazuje, jak przekazać wiadomość do rozmowy i odzwierciedlają aktualny timestamp z komunikatem:

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

Wyjście gdy ten jest uruchamiany jest:

test: 

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

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

@Rich - co pan zmienić? jaka była różnica pomiędzy oryginałem Aarona a twoją zmianą? – andersonbd1

+2

@ andersonbd1, w pierwszym przypadku macrodef ustawi właściwość ze znacznikiem czasu, po ustawieniu znacznika czasu będzie używana wszędzie w kompilacji z oryginalną wartością. W drugiej wersji zmienna znacznika czasu jest dopasowana do wywołania wewnętrznego, więc będzie miała nową wartość za każdym razem –

2

stwierdziliśmy, że jeśli używasz go jako makro, a nie jako ant target, działa lepiej, ponieważ nie pętli przez plik ant od początku za każdym razem, gdy robisz antcall target= (mniej sprawdzić, czy masz zależności i zestawy właściwości).

<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

Wyświetla ten sam znacznik czasu za każdym razem. – Slav

10

I jak macrodef roztworu, jeśli rzeczywiście jest to bardziej efektywne niż cel jeden, ale użyć var unset=true wymusić wyzerowanie zmiennych, jak:

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

Wykorzystanie

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

Zauważ, że zadanie 'var' nie pochodzi z jądra, ale [ant-contrib] (http://ant-contrib.sourceforge.net/). – zb226

10

Po odpowiedzi @ Niek możemy zbudować makro, które zachowuje się jak echo, ale z datownikiem

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

które dadzą wyświetlamy

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

Jedną z zalet używania macrodef jest to, że nie zapisuje się danych wyjściowych z nazwą obiektu docelowego timestamp2. Dane wyjściowe po prostu wyglądają jak anotowane echo. –

Powiązane problemy