Выведите несколько временных меток в 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>