以下のAntビルドファイルスニペットは、各SQLスクリプトが実行される前後の時間を単純に出力する試みです。 Antターゲットの構造を変更することはできません(create-tablesはrun-sql-scriptを呼び出す必要があります)。問題は、プロパティ(timeとtime2)が不変である( http://ant.Apache.org/manual/Tasks/property.html )ため、2番目の操作ではなく最初の操作のみの時間になることです。 。 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>
使う - <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 />
更新: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
実際にターゲットソリューションよりも効率的である場合、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 />
@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
Antターゲットではなくマクロとして使用すると、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>