2009-06-19 3 views
23

Ich habe einen Fall, wo ich einfach nicht herausfinden kann, wie Ant bekommen nur die Dateien, die ich in einer Dateigruppe (warum in aller Welt haben die Ameisenmenschen nicht einfach Regex benutzt?).Tricky Ant Fileset (einschließlich der meisten, aber nicht alle eines Verzeichnisses)

Hier ist die Situation. Ich habe eine Menge Klassen unter dem Klassenverzeichnis. Ich möchte:

1) Alle Dateien unter Klassen,

2), aber nicht diejenigen, die unter/com/foo/

3) bar Außer ich will tun/com/foo/bar/AbstractCustomerAdapter .class und CustomerAdapterFactory.class.

Die Dateien unter/com/foo/bar heißen im Allgemeinen Dinge wie FooCustomerAdapter.class.

Kurz gesagt, wir erstellen 2 Gläser, eines mit nur den kundenspezifischen Adpaters und eins mit allem anderen. Dies ermöglicht uns, einen neuen Kundenadapter zu erstellen und nur diesen Mini-Jar auszutauschen. Die obige Dateizeile, die mich umbringt, ist die "alles andere".

Sobald Ant eine Datei ausschließt, wird kein Include es zurück bringen, so dass Elemente 2 & 3 mir Kummer bereiten, wie man die Dateigruppe macht. Wie kann ich alle meine Kundenadapter ausschließen, aber nicht den abstrakten Kundenadapter? Es gibt keine ant-kompatible Wildcard, die ich tun kann, um die XZYCustomerAdapter-Klassen auszuschließen, ohne den AbstractCustomerAdapter auszuschließen.

Nun, zumindest kann ich nicht einen Reim darauf machen, aber hoffentlich einer von euch Stack-Überlauf Denizens ist klüger als ich :)

Antwort

45

Die meisten Aufgaben, die eine einzelne Dateigruppe akzeptieren, können auch mehrere Dateigruppen akzeptieren.

<jar file="..."> 
    <fileset dir="classes"> 
    <exclude name="com/foo/bar/**"/> 
    </fileset> 

    <fileset dir="classes"> 
    <include name="com/foo/bar/AbstractCustomerAdapter.class"/> 
    <include name="com/foo/bar/CustomerAdapterFactory.class"/> 
    </fileset> 
</jar> 
+0

Süß, das funktioniert! –

0

ein custom selector schreiben. Die API ist einfach zu implementieren. Da haben Sie die ganze Kraft von Java, die Sie brauchen, um sich zu entscheiden.

+0

Ja, ich habe versucht, wirklich einen eigenen Selektor zu vermeiden einfach Ant Mangel an regex zu überwinden ... :(. Wenn ich diesen Weg zu gehen, werde ich Hand Liste nur die 50 Dateien oder so ich muss ausschließen, hässlich wie das. –

1

Ich habe zwei verschiedene Dinge, die ich an verschiedenen Orten mache. Manchmal kopiere ich Dateien an einen temporären Ort, damit ich alles in einem Schritt plausibel machen und in einem späteren Schritt einige spezifische Elemente ausschließen kann. In anderen Fällen verwende ich zwei separate Anweisungen.

Sie scheinen die temporären Dateien nicht zu benötigen, aber um einige Textdateien in die PC-Zeilenendung vor dem Erstellen einer Installation zu transformieren, kopiere und konvertiere ich alles (mit fixcrlf) in ein temporäres Verzeichnis und wähle dann und wählen Sie Dateien für verschiedene Plattformen aus der erstellten Hierarchie.

Beim Erstellen von TAR-Dateien scheint es ausreichend zu sein, eine bestimmte Datei in eine Zeile aufzunehmen und das Muster in einer späteren Zeile auszuschließen, die andere Dateien enthält.

<tarfileset dir="classes" includes="classes" excludes="classes/com/foo/bar" />
<tarfileset dir="classes" includes="classes/com/foo/bar/AbstractCustomerAdapter.class,classes/com/foo/bar/CustomerAdapterFactory.class" />

Wenn Jar-Dateien wie Dateien tar und zip nicht konstruiert sind, müssen Sie eventuell die Dateihierarchie explizit als ich mit fixcrlf tun, um bauen, und die JAR-Datei in einem zweiten Durchgang aus der korrigierten Hierarchie aufbauen .

Verwandte Themen