Ant – Propertyfiles und Conditions
Jetzt aber wirklich der letze Teil meiner kleinen Ant-Reihe. Mir sind nämlich noch zwei Features eingefallen, die ich noch erklären will, bevor wir das Thema erstmal ad acta legen. Ich mache das übrigens auch für mich, denn im Moment bin ich fit in der Thematik, aber wer weiß, wie es damit in ein paar Wochen aussieht. Mein Gedächtnis hat manchmal einige Eigenschaften eines Siebs.
Fangen wir aber einfach mit den Propertyfiles an. Im letzten Artikel hatte ich ja schon erklärt, dass man Properties ganz einfach innerhalb eines Build-Files definieren kann. Das ging dann so:
<property name="sourcePath" value="/path/to/sources"/>
Irgendwie ist das wie Konstanten zu definieren in einem Softwareprojekt. Das kann man machen, aber wenn man sie oft ändern will, dass fühlt sich das irgendwie nicht richtig an. Dann packt man das doch lieber in eine Konfigdatei, da gehört sowas ja auch hin. Für die ant-Skripte sehe ich das ähnlich. Packen wir diese Einstellungen also in eine Konfigurationsdatei. Im Ant-Jargon nennen wir diese propertyfiles. Die sehen dann wir folgt aus:
# phpunit properties
phpunit.enabled = true phpunit.bootstrap = boostrtap.php phpunit.memory_limit = 512M
Das speichern wir zum Beispiel in eine project.property Datei und schon sind wir fast fertig. (Schreibe ich eigentlich oft „jetzt sind wir fertig“ ?, kommt mir grad so vor). Diese Datei können wir jetzt in unserem Build-Skript einfach einbinden:
<property file="project.property" />
oder aber wir machen es noch ein wenig schöner. Wir können auch ein wenig Dependency Injection spielen und das Propertyfile als Parameter beim Aufruf mitgeben.
ant -propertyfile project.properties
So das war das vorletzte Stück Wissen, dass ich gesammelt habe. Jetzt gehen wir noch mal kurz auf die Möglichkeit ein IF-Abfragen in unseren Skripten einzusetzen. Ich habe vorher ja schon mal eine Property aufgelistet, die phpunit.enabled heißt. Ziel ist es jetzt ein target, also eine Gruppe von Anweisungen, nur dann auszuführen, wenn die Property auf true gesetzt ist. In Code ausgedrückt sieht das dann so aus:
<condition property="phpdoc_enabled"><equals arg1="${phpdoc.enabled}" arg2="true"/></condition><target name="phpunit" if="phpunit_enabled">...</target>
Joa, eigentlich ganz einfach. In der Condition oben wird die Variable phpdoc_enabled auf Wahr gesetzt, sobald das Argument1 und das Argument2 gleich sind. In unserem Target können wir dann ganz einfach das Attribut if benutzen und fertig. Jetzt fragt ihr euch wahrscheinlich, warum ich nicht gleich die phpdoc.enabled Variable in dem IF-Konstrukt verwendet habe? Naja dummerweise wird das IF immer Wahr, sobald der Wert gesetzt ist, egal wie. Also könnte auch False drinstehen und es würde klappen. Das macht sich aber in einem Propertyfile irgendwie nicht so gut. Intuitiv will man true und false verwenden und dafür müssen wir eben diesen kleinen Umweg gehen.
So jetzt fällt mir wirklich nichts mehr ein, aber ich hoffe, dass der ein oder andere etwas mitgenommen hat. Mir hat’s auf jeden Fall geholfen.
Ant ist schon ein sehr nützlicher Helfer. Ich nutze die Properties auch gerne um die SVN-Informationen zu speichern. Dazu habe ich in jedem Buildfile einen Task der „svn info“ ausführt und die Informationen in die entsprechende Datei schreibt.
Daraus kann man die Informationen jederzeit wieder auslesen um z.B. Platzhalter im Sourcecode mit der Revision des deployten Packets zu ersetzen. Vielleicht soll auch ein Zip-Archiv einen entsprechenden Dateinamen bekommen…
Viele Grüße, Micha
Da mein Codebeispiel gefressen wurde habe ich es auf pastie.org eingestellt: http://pastie.org/1103567
Kann man mit Properties nun rechnen?
‚property name=“result“ value=“${number}-1″‚
Ansonsten empfand ich die Artikelserie als sehr angenehm, werde die Konfiguration meiner Property-Files sowie Code-Duplikation zwischen verschiedenen Build-Skripten durch Import-Statements sicherlich ändern. Danke!
@Ulf: Hatte ein wenig zu dem Thema gegoogelt, aber keine brauchbare Antwort gefunden. Kann dir da also nicht wirklich helfen.
@Ulf: Man kann in einen Ant Target auch JavaScript nutzen und somit auch rechnen. Mehr Infos z.B. hier: http://www.sitepen.com/blog/2001/09/25/javascript-and-ant/
Falls es noch jemanden interessiert (kann auch gerne detaillierter darüber berichten):
Einen JavaScript Target für Phing gibt es so nicht, zumindest konnte ich keinen finden. Der PhpEvalTask (http://phing.info/docs/guide/current/chapters/appendixes/AppendixB-CoreTasks.html#PhpEvalTask) kann aber genau das, was ich benötige. Ein insgesamt sehr mächtiger Tasks wenn man überlegt alle PHP-Funktionen damit über Phing verwenden zu können.