2008-09-08 9 views
18

Wir haben ein Apache ANT-Skript, um unsere Anwendung zu erstellen, und checken dann die resultierende JAR-Datei in die Versionskontrolle ein (in diesem Fall VSS). Jetzt müssen wir jedoch zwei JAR-Dateien für dieses Projekt erstellen und dann beide in VSS überprüfen.Gibt es eine Möglichkeit, ein Apache ANT-Ziel zu verallgemeinern?

Das aktuelle Ziel, das die ursprüngliche JAR-Datei in VSS überprüft, erkennt den Namen der JAR-Datei über eine Eigenschaft. Gibt es eine einfache Möglichkeit, dieses Ziel zu "verallgemeinern", so dass ich es wiederverwenden kann, um eine JAR-Datei mit einem beliebigen Namen einzulesen? In einer normalen Sprache würde dies natürlich einen Funktionsparameter erfordern, aber meines Wissens gibt es in ANT kein äquivalentes Konzept.

Antwort

46

Ich würde vorschlagen, mit macros über subant/antcall zu arbeiten, weil der Hauptvorteil, den ich mit Makros gefunden habe, dass Sie die vollständige Kontrolle über die Eigenschaften haben, die an das Makro übergeben werden (besonders wenn Sie neue Eigenschaften hinzufügen möchten) .

Sie einfach Ihren Ant-Skript Refactoring mit Ihrem Ziel Start:

<target name="vss.check"> 
    <vssadd localpath="D:\build\build.00012.zip" 
     comment="Added by automatic build"/> 
</target> 

Erstellen ein Makros (man beachte das Kopieren/Einfügen und Ersetzen mit der @ {Datei}):

<macrodef name="private-vssadd"> 
    <attribute name="file"/> 
    <sequential> 
     <vssadd localpath="@{file}" 
      comment="Added by automatic build"/> 
    </sequential> 
</macrodef> 

und riefen die Makros mit Ihren Dateien:

<target name="vss.check"> 
    <private-vssadd file="D:\build\File1.zip"/> 
    <private-vssadd file="D:\build\File2.zip"/> 
</target> 

Refactoring "die Ant way"

+1

Es scheint, Sie haben vergessen, Tag zu schließen. Es sollte wie '' –

+0

Super Vorschlag sein. Vielen Dank. –

20

Es wird allgemein als eine schlechte Idee angesehen, Versionskontrolle Ihrer Binärdateien und ich empfehle es nicht. Aber wenn Sie es unbedingt tun müssen, können Sie antcall kombiniert mit param verwenden, um Parameter zu übergeben und ein Ziel aufzurufen.

<antcall target="reusable"> 
    <param name="some.variable" value="var1"/> 
</antcall> 

<target name="reusable"> 
    <!-- Do something with ${some.variable} --> 
</target> 

Sie können weitere Informationen über die antcall task here finden.

+3

Es ist wahrscheinlich eine bessere Idee, Makros anstelle von antcall zu verwenden (siehe die anderen Antworten). Mit antcall brichst du den Abhängigkeitsmechanismus der Ameise auf und tendierst dazu, mit ziemlich verwirrenden Build-Logs zu enden. –

3

Überprüfen Sie auch die subant Aufgabe aus, die Sie Dateien auf mehreren bauen rufen das gleiche Ziel lässt:

einen Blick auf Ant
<project name="subant" default="subant1"> 
    <property name="build.dir" value="subant.build"/> 
    <target name="subant1"> 
     <subant target=""> 
      <property name="build.dir" value="subant1.build"/> 
      <property name="not.overloaded" value="not.overloaded"/> 
      <fileset dir="." includes="*/build.xml"/> 
     </subant> 
    </target> 
</project> 
5

Nehmen macros. Sie ermöglichen Ihnen, wiederverwendbare "Routinen" für Ant-Builds zu definieren. Sie finden ein Beispiel here (Punkt 15).

1

Sie können verwenden, um Ihren Build mit groovy zu skaten, was Sie wollen, oder sehen Sie sich die groovy ant task an.