在您的一个名为"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...." />
如果有人能解释我如何使"蚂蚁中的输出时间戳"主题的 2 个解决方案之一工作,我会很高兴!!
根据 TSTAMP 来源,它应该可以工作(此处来源) 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>
好的,如果在默认目标中,我确实更改了格式属性的名称,它可以工作。所以后面有一些缓存魔法。
Ant 中是不可变的;它们不是变量。
但是,您可能可以使用<local>
任务来实现所需的目标。此任务会导致之后在target
(或sequential
或任何其他块)中设置的属性仅在本地指定。
因此,如果您所有的时间戳回显都在单独的目标中,那么它将起作用。 在单个目标中,您仍然需要使用多个属性,如"time_start"、"time_end"等。
在此线程的后续中,我读到macrodef是一种更合适的方法,因为它每次调用时都会不断实例化,因此没有缓存问题。 我简化了他们的例子。 我包含了我的整个文件,所以你可以把下面的代码保存为时钟.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:desktopclock.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
根据 Bee Kay 的回答,此宏通过避免使用"local",而是在"macrodef"上使用"attribute"来与 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