ant: Verzeichnis-Operationen auf dynamischen Pfaden

Ich möchte auf einer Menge von Unterordnern (“log/”, “temp/”, später vielleicht weitere) eines dynamischen Über-Ordners beispielhaft die Rechte auf 777 ändern:

Zuerst definiere ich die Unterordner. Das mache ich nicht mit DirSet und <for>, da ich dann den Pfad nicht mehr mit dem Über-Ordner prefixen kann. Stattdessen nehme ich ein kommasepariertes property und <for>:

Dann lagere ich das eigentliche chmod und den Loop in eine macrodef aus, um den Über-Ordner übergeben zu können – hier sieht man, was ich mit “prefixen” meine: Ich setze @{basedir} vor jeden Eintrag @{rwFolder} in ${rwfolders.application}

Übrigens: Anders, als in der Doku beschrieben, reicht Attribut “file” nicht, es muss Attribut “dir” sein!

Und schliesslich der Aufruf mit variablem @{basedir}:

AS3: Lesbarer “link-report”

Mit dem mxmlc lassen sich “Link-Reports” erstellen; entfernt vergleichbar mit dem “Größenbericht” aus der Flash-IDE: Welche Klassen sind in meiner SWF enthalten, und wie viel Platz belegen sie. Die Compileroption dazu (in Ant-Schreibweise aus FDT):

Allerdings sind diese Linkreports schlecht lesbar. Ich möchte auf einen Blick sehen, welche Klasse der Grund dafür ist, dass mein SWF 2 MB statt 500 KB groß ist. Gut, dass es Theo Hultberg gibt: Der hat eine XSL geschrieben, um den Linkreport in eine verständliche Form zu bringen (hier der Blogeintrag und die lokale Kopie der XSL). Ant kann XSL von haus aus:

Das Ergebnis kann sich sehen lassen: Nach Größe sortiert und mit Verlinkung auf die Klasse/SWC

linkreport

Apache Ant: Ja/nein-Dialog

Apache kennt von haus aus nur Input Dialoge (korrigiert mich), und damit kann man natürlich “j”/”n”-Eingaben bauen (siehe Examples).  Schöner ist aber ein richtiger Ja/Nein-Dialog, wie Javascripts confirm. Außerdem gibt es if/else nur mit Ant contrib, das nicht zwingend überall installiert ist. Bitte nennt mir eine schönere Lösung als die folgende, aber damit geht’s – Confirm-Dialoge und if/else-Verzweigung abhängig von der User-Eingabe:

Die Targets “setURLs” und “setURLsAndProxy” werden nur abhängig von ${useProxy} ausgeführt, bzw nicht ausgeführt (if/unless).

Apache Ant: antcall für fileset

Dateien lassen sich in Ant (auch rekursiv) mit fileset finden. Allerdings kann man mit Bordmitteln nicht pro gefundenem File einen antcall absetzen. Das Internet schlägt Ant-Contrib vor, da gibt es “for” und “foreach”, aber das zum Laufen zu bekommen bin ich gerade zu blöd. Warum liefern die ihr ant-contrib-<version>.jar nicht mit aus??

Egal. Was mit Bordmitteln geht, ist Javascript (Danke, Björn!). Dann kann man Dateien mit JS auslesen, und an antcall übergeben. Zusammen sieht das so aus:

Apache Ant: replaceregexp und HTML

Wer mit Ants replaceregexp HTML suchen und ersetzen möchte, wird recht schnell in Fehler wie

  1. Wert des Attributs “match”, das mit Elementtyp “null” verknüpft ist, darf nicht das Zeichen “<” enthalten.
  2. Öffnendes Anführungszeichen wird für Attribut “{1}” erwartet, das mit Elementtyp “id” verknüpft ist.
  3. Auf Elementtyp “replaceregexp” müssen entweder Attributspezifikationen, “>” oder “/>” folgen.

bzw deren englischer Entsprechung

  1. The value of attribute “match” associated with an element type “null” must not contain the ‘<‘ character.
  2. Open quote is expected for attribute “{1}” associated with an element type “id”.
  3. Element type “replaceregexp” must be followed by either attribute specifications, “>” or “/>”.

stoßen. Lösung:

  1. alle “<” durch &lt; ersetzen. Mit “” escapen genügt nicht.
  2. Geöffnete Anführungszeichen müssen geschlossen werden m(
  3. Alle Anführungszeichen durch “&quot;” ersetzen. Mit “” escapen genügt nicht.

PS:

  • Um mehrere Zeilen gleichzeitig zu ersetzen, muss man – etwas uneingängig – das Flag “s” setzen.
  • Um (potentiell) verschachtelte Tags (z.B. DIV) zu ersetzen, immer nicht-“greedy” arbeiten, also z.B. mit (.*?) statt mit (.*)

Actionscript: Automatisch erzeugte Versionsnummer im Kontextmenü

Für ein Projekt wollte ich irgendeine Möglichkeit haben, einer SWF ihre genaue Versionsnummer “anzusehen”. Dies sollte unbedingt automatisiert geschehen. Ich glaube mich dunkel zu erinnern, dass man mit Ant auch direkt in die AS-Klassen schreiben kann, finde das aber gerade nicht wieder… was ich aber gefunden habe basiert ebenfalls auf Ant, genauer gesagt: Auf dem “BuildNumber”-Task.

Damit liest man eine Nummer aus einer Datei (default: build.number), erhöht sie um 1, und schreibt das Ergebnis zurück. Soweit, so gut. Aber wie bekommt man das in die SWF? Mit einer Klasse, die in etwa so aussieht (ich habe es auch mit einer internal class probiert, aber nicht hinbekommen – Tipps sind willkommen!):

Diese Klasse kann man nun instantiieren und auslesen:

Eleganter: Man schreibt den Inhalt in’s Kontextmenü:

HTH

FDT+Ant: Java Heap Space und PermGen Space [Update]

Wer beim Kompilieren mit Ant in FDT einen Java Heap Space Error bekommt, kann der Java Virtual Machine mehr Speicher zuweisen. Nein, nicht über die Eclipse.ini, sondern über die Einstellungen:

Einstellungen -> Java -> Installed JREs -> [aktuelles JRE] -> Default VM Arguments -> “-Xmx512m”
(ohne Anführungszeichen; den Wert ggf. abwandeln)

Quelle

Wer dagegen einen “PermGen Space”-Error bekommt (kenne ich auch erst seit neuestem), der regelt das über die “External Tools Configuration”:

“Run”-Menü -> External Tools -> External Tools Configurations -> [aktueller Ant-Task] -> JRE -> VM Arguments -> “-Xmx512m”
(ohne Anführungszeichen)

Hier muss man etwas ausprobieren; mein Wert weicht von der Quelle ab, und die nutzt andere Einstellungen als ihre Quelle 🙂

UPDATE:

Auf http://factornine.wordpress.com/2008/04/15/how-to-increase-memory-allocated-to-eclipse/ sehe ich, wie ich mir nicht nur den aktuellen Heap Space anzeigen lassen kann, sondern auch, wie ich manuell die Garbage Collection angezeigt bekomme:

Einstellungen -> General -> Show heap status

Das Ganze sieht dann so aus:

Eclipse: Kompilieren mit Apfel+Enter

Die Flash IDE ist Mist, da sind sich alle einig. Und in Eclipse/FDT (im Flash-Builder vermutlich auch) kompiliert man am Besten mit Ant. Aber: Wo man in der IDE mit Apfel+Enter (Mac, Windows: Strg+Enter) kompiliert, muss man in FDT immer die Maus bemühen, um Ant zu starten. Das kann man aber in den Voreinstellungen ändern: General -> Keys -> “Run Last Launched External Tool” auf Apfel+Enter gemapped, und schon startet diese Kombination das zuletzt verwendete Ant-Script!

Danke an Robert für den Tipp!