在ant中输出几个时间戳

and*_*bd1 20 ant timestamp

下面的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)

  • @ andersonbd1,在第一个实例中,macrodef将设置一个带有时间戳的属性,一旦设置了时间戳,它就会在构建中的任何地方使用原始值.在第二个版本中,timestamp变量的范围限定为内部调用,因此每次都会有一个新值 (2认同)

小智 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)