在你的一个名为“ant中的输出时间戳”的主题中,我测试了解释的2路,以便在同一个Ant脚本中显示多个时间。
但是,这2个解决方案对我不起作用,Ant给我的所有时间都是相同的日期/时间。
任何人都可以解释我为什么?
我找到了一个解决方案(但请注意我的想法):
<tstamp>
<format property="date.etape1" pattern="dd/MM/yyyy HH:mm:ss" />
</tstamp>
<echo message="${date.etape1} bla bla bla...." />
<tstamp>
<format property="date.etape2" pattern="dd/MM/yyyy HH:mm:ss" />
</tstamp>
<echo message="${date.etape2} bla bla bla...." />
如果有人能解释我如何使作品“蚂蚁输出时间戳”的两个解决方案之一,我会非常高兴!!!
答案 0 :(得分:1)
根据TSTAMP来源它应该工作(来源here)Date对象总是被实例化。表面背后可能还有一些奇怪的任务回收?
我正在尝试使用这个ant构建文件
<project name="testTStamp" default="xxx" basedir=".">
<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>
<target name="default">
<tstamp>
<format property="current.time_one" pattern="MM/dd/yyyy hh:mm:ss.SSS aa"/>
</tstamp>
<echo message="RUN_TIME: ${current.time_one}"/>
<sleep seconds="5"> </sleep>
<tstamp>
<format property="current.time_two" pattern="MM/dd/yyyy hh:mm:ss.SSS aa"/>
</tstamp>
<echo message="RUN_TIME: ${current.time_two}"/>
</target>
<target name='xxx' depends='default, testMe' />
</project>
好的,如果在默认目标中,我确实更改了format属性的名称,它就可以了。所以有一些缓存魔术师。
答案 1 :(得分:0)
Properties在Ant中是不可变的;它们不是变量。
但是,您可以使用<local>
任务完成所需的操作。此任务导致之后在target
(或sequential
或任何其他块)中设置的属性仅在本地指定。
因此,如果您的所有时间戳回声都在不同的目标中,那么它将起作用。在单个目标中,您仍然需要使用多个属性,如“time_start”,“time_end”等。
答案 2 :(得分:0)
在这个线程的后续文章中,我已经读过macrodef是一个更合适的方法,因为它每次调用都会保持实例化,所以没有缓存问题。我简化了他们的例子。我包含了我的整个文件,所以你可以将下面的代码保存为clock.xml并直接从ant运行。
<project name="marktime" basedir=".">
<description>
logstamp is a simple macrodef for ANT to echo a time stamp out to an open log.
It is not written to pass back the current time, just simple echo to stdout.
You are welcome to add which file to output the results to, add blurbs to messages.
</description>
<macrodef name="logstamp">
<sequential>
<local name="logtime"/>
<tstamp>
<format property="logtime" pattern="yyyy.MM.dd : HH:mm:ss z"/>
</tstamp>
<echo message=" ### Current time now: ${logtime}"/>
</sequential>
</macrodef>
<target
name="init"
description="boilerplate for all targets">
<!-- Just run the Macrodef -->
<logstamp/>
<sleep seconds="5"> </sleep>
<logstamp/>
<sleep seconds="5"> </sleep>
<logstamp/>
<sleep seconds="5"> </sleep>
<logstamp/>
<sleep seconds="5"> </sleep>
<logstamp/>
</target>
</project>
结果如下:
C:\desktop\>ant -f clock.xml init
Buildfile: C:\desktop\clock.xml
init:
[echo] ### Current time now: 2014.02.14 : 16:41:06 PST
[echo] ### Current time now: 2014.02.14 : 16:41:11 PST
[echo] ### Current time now: 2014.02.14 : 16:41:16 PST
[echo] ### Current time now: 2014.02.14 : 16:41:21 PST
[echo] ### Current time now: 2014.02.14 : 16:41:26 PST
BUILD SUCCESSFUL
Total time: 20 seconds
答案 3 :(得分:0)
根据Bee Kay的回答,此宏可与ANT版本1.7一起使用,避免使用“本地”,而在“宏”上使用“属性”:
<project name="echotime" basedir="." default="echotime">
<description>
echotime is a simple macrodef for ANT to echo a time stamp to an open log.
It is not written to pass back the current time, just simple echo to stdout.
</description>
<macrodef name="echotime">
<attribute name="logtime" default="" />
<sequential>
<tstamp>
<format property="logtime" pattern="yyyy.MM.dd HH:mm:ss z" />
</tstamp>
<echo message="Build finished at ${logtime}" />
</sequential>
</macrodef>
<target name="echotime">
<echo message="${ant.version}" />
<echotime />
</target>
结果如下:
>ant -buildfile echotime.xml
Buildfile: echotime.xml
echotime:
[echo] Apache Ant version 1.7.1 compiled on June 27 2008
[echo] Build finished at 2019.12.19 11:43:29 EST
BUILD SUCCESSFUL
Total time: 0 seconds