Выведите несколько временных меток в ant

Ниже приведен фрагмент Ant buildfile - попытка просто вывести время до и после запуска каждого sql script. Я не могу изменить структуру целей Ant (create-tables должны вызвать run-sql- script так же, как и он). Проблема в том, что свойства (время и время2) неизменяемы (http://ant.apache.org/manual/Tasks/property.html) и, следовательно, только время первой операции, а не вторая. Нет ли способа сделать то, что я пытаюсь сделать в 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>

Ответ 1

Используйте MacroDef вместе с локальной задачей (представленной в 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 />

Ответ 2

Обновление. Вы можете использовать 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

Ответ 3

Мне нравится решение 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 />

Ответ 4

Следуя от ответа @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

Ответ 5

Я обнаружил, что если вы используете его как макрос, а не цель ant, он работает лучше, поскольку он не запускается через файл ant с самого начала каждый раз, когда вы выполняете 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>

Ответ 6

От ant 1.8, основываясь на предыдущих ответах и ​​позволяя быстро искать и заменять все существующие <echo>, которые используют встроенный текст (или используют атрибут message) и не требуют использования ant -contrib <var ... unset="true"/>, вы можете использовать встроенную Local Task для вывода новой метки времени для каждого вызова:

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

Использование:

<echoTS>first msg</echoTS>
<sleep seconds="3"/>
<echoTS>second msg</echoTS>