下面的Ant构建文件片段试图简单地输出每个sql脚本运行之前和之后的时间.我无法更改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>
Run Code Online (Sandbox Code Playgroud)
Ric*_*ler 32
更新:您可以使用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>
Run Code Online (Sandbox Code Playgroud)
运行时的输出是:
test:
timestamp2:
[echo] hello 09/24/2009 05:33:22 PM
timestamp2:
[echo] world 09/24/2009 05:33:24 PM
Run Code Online (Sandbox Code Playgroud)
小智 11
将<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 />
Run Code Online (Sandbox Code Playgroud)
Nie*_*iek 10
我喜欢macrodef解决方案,如果它确实比目标解决方案更有效,但我使用a 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>
Run Code Online (Sandbox Code Playgroud)
用法
<echoTimestamp />
<sleep seconds="3"/>
<echoTimestamp />
Run Code Online (Sandbox Code Playgroud)
Jam*_*ook 10
继@ Niek的回答之后,我们可以构建一个行为类似echo但带有时间戳的宏
<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>
Run Code Online (Sandbox Code Playgroud)
这将产生输出
test-timestamp:
[echo] 2013-05-03 12:02:38> hi
Run Code Online (Sandbox Code Playgroud)