Versionierung mit ANT
Wer mit eclipse arbeitet, dem ist der Begriff ANT bestimmt schon begegnet. ANT ist ein in Java geschriebenes Werkzeug mit dem man sich einige Arbeiten durch etwa Automatisierungen erleichtern kann. Ich möchte euch gerne ein kleines Beispiel geben, wie ich mit ANT eine “Versionierungs-Klasse” vor dem Kompilieren aktualisiere.
Mein Projektstruktur sieht momentan folgend aus (bedeutend sind eigentlich nur die markierten Dateien):

Aus dem Konstruktor meiner Hauptklasse FilterMenu wird die statische Funktion traceInit() der Klasse Version aufgerufen.
public function FilterMenu()
{
Version.traceInit();
}
Die Funktion Version.traceInit() ist sehr simple, da sie nur bestimmte Informationen ausgibt, die als statische Konstanten angegeben sind.
package
{
public class Version
{
public static const VERSION_MAIN : String = "1.33";
// replaced at PRE-COMPILE by ANT
public static const VERSION_BUILD : String = "0051";
public static const VERSION_BUILD_TIME : String = "15.06.2010 08:57";
public static const VERSION_BUILD_USER : String = "Dominik Beinenz";
public static const VERSION_REVISION : String = "260";
public static function traceInit() : void
{
trace("-----------------------------------------------");
trace("VERSION: " + VERSION_MAIN);
trace("Build-Number: " + VERSION_BUILD);
trace("Build-Time: " + VERSION_BUILD_TIME);
trace("Build-User: " + VERSION_BUILD_USER);
trace("Revision: " + VERSION_REVISION);
trace("-----------------------------------------------");
}
}
}
Diese Klasse wird vor dem Kompilieren dynamisch mit Inhalten versorgt. Das ANT-Skript, dass dafür zuständig ist, starte ich in der Run-Configuration des Projektes.

So, jetzt kommt eigentlich erste der interessantere Teil, und zwar der Inhalt des ANT-Skriptes.
Als erstes wird in der Datei build.properties die Variable buildNumber um eins erhöht:
<propertyfile file="${basedir}/ant/build.properties">
<entry key="buildNumber" type="int" default="0" operation="+" pattern="0000" />
</propertyfile>
Eine Meldung wird in der Console ausgegeben:
<echo message="Updating Version.as..." />
Die Variable buildNumber die zuvor erhöht wurde wird jetzt eingelesen:
<property file="${basedir}/ant/build.properties"/>
Das Format für das Datum und die Zeit wird definiert:
<tstamp>
<format property="touch.time" pattern="dd.MM.yyyy kk:mm" offset="0" unit="hour"/>
</tstamp>
Die SVN-Revisionsnummer wird ausgelesen:
<loadfile property="dist.revision" srcFile="./.svn/entries">
<filterchain>
<headfilter lines="1" skip="3"/>
<deletecharacters chars="\n"/>
</filterchain>
</loadfile>
Am Schluss werden alle Konstanten der Klassen-Datei Versions.as ersetzt: (hier die buildNumber)
<replaceregexp file="${basedir}\src\Version.as"
match="VERSION_BUILD : String = (.*)"
replace="VERSION_BUILD : String = "${buildNumber}";"
byline="true"/>
Das nochmal das komplette ANT-Skript:
<project name="FilterMenu2" default="replaceVersion" basedir=".">
<target name="replaceVersion">
<propertyfile file="${basedir}/ant/build.properties">
<entry key="buildNumber" type="int" default="0" operation="+" pattern="0000" />
</propertyfile>
<echo message="Updating Version.as..." />
<property file="${basedir}/ant/build.properties"/>
<tstamp>
<format property="touch.time" pattern="dd.MM.yyyy kk:mm" offset="0" unit="hour"/>
</tstamp>
<loadfile property="dist.revision" srcFile="./.svn/entries">
<filterchain>
<headfilter lines="1" skip="3"/>
<deletecharacters chars="\n"/>
</filterchain>
</loadfile>
<replaceregexp file="${basedir}\src\Version.as"
match="VERSION_BUILD : String = (.*)"
replace="VERSION_BUILD : String = "${buildNumber}";"
byline="true"/>
<replaceregexp file="${basedir}\src\Version.as"
match="VERSION_BUILD_TIME : String = (.*)"
replace="VERSION_BUILD_TIME : String = "${touch.time}";"
byline="true"/>
<replaceregexp file="${basedir}\src\Version.as"
match="VERSION_BUILD_USER : String = (.*)"
replace="VERSION_BUILD_USER : String = "${user.name}";"
byline="true"/>
<replaceregexp file="${basedir}\src\Version.as"
match="VERSION_REVISION : String = (.*)"
replace="VERSION_REVISION : String = "${dist.revision}";"
byline="true"/>
</target>
</project>
