2008-12-17 7 views
13

Die build.xml hat einen Test und einen Build Ziel. Das Test Ziel hängt offensichtlich von der Build Ziel.Bietet Ant eine Möglichkeit, Abhängigkeiten zu umgehen?

Wie kann ich nur das Testziel ausführen, vorübergehend Überspringen der Kompilierung, ohne die Datei build.xml zu ändern?

Ich frage, weil die Kompilierung zu lang ist und durch einen Continuous Integration Server auf dem neuesten Stand gehalten wird; und ich jage nach einem Problem mit den Komponententests.

Antwort

19

Nein, Sie können nicht überspringen, ohne die Build-Datei zu ändern.

Hier ist, was ich in meinen Projekten tun, um dieses Problem zu lösen. Für jedes öffentliche Ziel werde ich ein privates Ziel mit "Do-" davor erstellen. Das private Ziel hat keine Abhängigkeit, und das öffentliche Ziel hat das "do" -Ziel als Abhängigkeit.

Zum Beispiel:

<target name="compile" depends="init, do-compile" description="Compiles all of the source code" /> 

<target name="do-compile"> 
     <javac destdir="${classes.dir}" debug="true" encoding="ISO-8859-1"> 
      <src refid="src.path" /> 
      <include name="*.java" /> 
      <classpath refid="external.libraries.classpath" /> 
     </javac> 
</target> 
+1

Klingt wie wir auf ähnliche Weise arbeiten - es ist schön zu wissen, ich bin nicht allein an dieser Front :) –

4

Ich persönlich habe das Abhängigkeitsmaterial in Ant gefunden, um mehr zu erreichen als zu helfen. Ich richte normalerweise zwei Sätze von Zielen ein - solche, die eigentlich Sachen machen () (ohne Abhängigkeiten) und dann Ziele, die nur Abhängigkeiten haben. Auf diese Weise können Sie einfach ein einzelnes Ziel ausführen, und Sie können auch problemlos die ganze Suite usw. ausführen. Dies passt in praktische (eher als ideologische) Anwendungen aus meiner Sicht.

+0

Nizza Trick, danke. – philant

0

Die Abhängigkeit nur vorübergehend "entfernen"? `Wenn der Code bereits erstellt wird, sollten alle Ihre Dateien verfügbar sein, nein? - oops, hab gerade gesehen, dass du die Datei nicht ändern kannst, hmm, warum machst du nicht den gleichen Job zuerst lokal?

2

Ein gut geschriebenes Buildziel muss nichts neu erstellen, wenn sich der Code nicht geändert hat. Die Tatsache, dass das Testziel davon abhängt, sollte weitgehend irrelevant sein. Wenn Sie das Erstellungsziel zweimal nacheinander ausführen und es beim zweiten Mal versucht, etwas neu zu erstellen, sollten Sie untersuchen, warum dies der Fall ist.

Die einfache Möglichkeit, die Ausführung des Ziels zu vermeiden, besteht darin, das Attribut "if" des Ziels auf den Namen einer Eigenschaft zu setzen. Wenn Sie diese Eigenschaft bei der Ausführung von Ant in der Befehlszeile festlegen, wird dieses Ziel umgangen.

+0

Einverstanden, aber Ant wird nur zum Bootstrap Makefile-basierte Kompilierung einer großen Codebasis verwendet. – philant

28

Verwenden Sie das Attribut unless.

<target name="test" unless="dont.run.tests"> 

Wenn Sie nicht wollen, "test" zu laufen, nur

ant -Ddont.run.tests = true

Es undefiniert sein sollten, wenn Sie die Tests wollen zu rennen. Ant prüft nur, ob es überhaupt definiert ist. Außerdem gibt es ein if Attribut, das das Gegenteil tut.

Hier ist ein article auf die beiden.

+1

Dies ist der richtige Ansatz, sollte als die richtige Antwort markiert werden –