2009-02-12 10 views
1

J'essaie d'afficher l'horodatage après chaque étape (cible). Lorsque le fichier ci-dessous Executing de construction par la fourmi testtime je reçois la sortie:Fichiers de construction apache ant

Buildfile: build.xml 

testdepend1: 
    [echo] ****** Start: test depend 1 ****** 
    [echo] ****** Finish: test depend 1****** 
    [echo] 02/12/2009 11:58:07 AM 

testdepend2: 
    [echo] ****** Start: test depend 2 ****** 
    [echo] ****** Finish: test depend 2****** 
    [echo] 02/12/2009 11:58:07 AM 

testdepend3: 
    [echo] ****** Start: test depend 3 ****** 
    [echo] ****** Finish: test depend 3****** 
    [echo] 02/12/2009 11:58:07 AM 

Execting le fichier de construction ci-dessous:

<?xml version="1.0" ?> 
<!-- ==================================================================== --> 
<!-- Sample Propagation Ant Script --> 
<!-- ==================================================================== --> 
<project name="Portal Propagation Ant Tasks" basedir="." default="usage"> 
    <tstamp> 
    <format property="TODAY_UK" pattern="MM/dd/yyyy hh:mm:ss aa" locale="en,UK" unit="second"/> 
    </tstamp> 

    <target name="testdepend1" description="test depend1"> 
    <echo message="****** Start: test depend 1 ******" /> 
     <sleep seconds="10"/> 
    <echo message="****** Finish: test depend 1******" /> 
     <echo>${TODAY_UK}</echo> 
    </target> 

    <target name="testdepend2" description="test depend2"> 
    <echo message="****** Start: test depend 2 ******" /> 
     <sleep seconds="10"/> 
    <echo message="****** Finish: test depend 2******" /> 
     <echo>${TODAY_UK}</echo> 
    </target> 

    <target name="testdepend3" description="test depend3"> 
    <echo message="****** Start: test depend 3 ******" /> 
    <sleep seconds="10"/> 
    <echo message="****** Finish: test depend 3******" /> 
     <echo>${TODAY_UK}</echo> 
    </target> 

    <target name="testtime" depends="testdepend1, testdepend2, testdepend3" description="output a timestamp" /> 

</project> 

Pourquoi ai-je toujours le même horodatage?

Répondre

3

Une fois évalué, TODAY_UK ne sera pas calculé à nouveau.

Peut être vous devez ajouter au début de votre tâche quelque chose comme:

<tstamp> 
    <format property="TODAY_UK" pattern="dd MMM yyyy HH.mm" locale="en_GB" /> 
</tstamp> 
<echo message="${TODAY} at ${TSTAMP}" /> 

Utilisation de la base Tâche tstamp


Vous avez this script à tester afin de configurer, puis afficher une timestamps:

<project name="tstamp_demo" basedir="." default="display"> 
    <target name="display" depends="tstamp" description="TSTAMP demo"> 
     <echo>DSTAMP: ${DSTAMP}</echo> 
     <echo>TSTAMP: ${TSTAMP}</echo> 
     <echo>TODAY: ${TODAY}</echo> 
     <echo>TODAY_UK: ${TODAY_UK}</echo> 
    </target> 


    <target name="tstamp" description="Set DSTAMP/TSTAMP/TODAY, plus whatever in the body"> 
     <tstamp> 
      <format property="TODAY_UK" pattern="d-MMMM-yyyy" locale="en,UK"/> 
     </tstamp> 
    </target> 

    <target name="display.start" depends="tstamp.start" description="TSTAMP demo with prefix"> 
     <echo>start.DSTAMP: ${start.DSTAMP}</echo> 
     <echo>start.TSTAMP: ${start.TSTAMP}</echo> 
     <echo>start.TODAY: ${start.TODAY}</echo> 
    </target> 

    <target name="tstamp.start"> 
     <tstamp prefix="start"/> 
    </target> 
</project> 
0

Vous obtenez toujours les mêmes heures tasser car la propriété contenant cette valeur est évaluer seulement une fois. La proposition d'ajouter un '' au début de la tâche n'aidera pas non plus car Ant ne mettra pas à jour la valeur de la propriété.

La solution que je suis venu avec est de définir votre propre tâche Ant:

public class StampedEcho extends Echo { 

    private String message; 
    private String pattern = "d-MMMM-yyyy"; 
    private Locale locale = Locale.US; 

    public void setPattern(String pattern) { this.pattern = pattern; } 

    public void setLocale(String locale) { this.locale = new Locale(locale); } 

    @Override 
    public void setMessage(String message) { this.message = message; } 

    @Override 
    public void execute() throws BuildException { 
     String date = new SimpleDateFormat(this.pattern, this.locale).format(new Date()); 
     super.setMessage(date + (this.message == null ? "" : " " + this.message)); 

     super.execute(); 
    } 
} 

Ensuite, définissez un fichier Antlib (par exemple message-antlib.xml) pour instancier et appeler la classe:

<antlib> 
    <macrodef name="tstamp"> 
     <attribute name="message" default=""/> 
     <attribute name="pattern" default="HH:mm:ss"/> 
     <attribute name="locale" default="en"/> 
     <sequential> 
      <!-- I suppose that the class is in Ant's classpath --> 
      <taskdef name="tsecho" classname="StampedEcho"/> 

      <tsecho message="@{message}" pattern="@{pattern}" locale="@{locale}"/> 
     </sequential> 
    </macrodef> 
</antlib> 

modifier votre build.xml classer en conséquence

<project xmlns:msg="antlib:message"> 
    <typedef file="message-antlib.xml" uri="antlib:message"/> 

    <target name="testing"> 
     <msg:tstamp/> 
     <msg:tstamp message="start"/> 
     <msg:tstamp message="end" pattern="HH.mm" locale="en_GB"/> 
    </target> 
</project> 

pour obtenir la sortie suivante:

[tsecho] 21:46:20 
[tsecho] 21:46:20 start 
[tsecho] 21.46 end 
Questions connexes