4 Stimmen

subant failonerror Feinheiten

Ich habe Ant-Code, der einen Release-Build in allen Unterverzeichnissen auslöst:

<target name="all-release" >
    <subant target="sub-release" failonerror="true">
        <fileset dir="." includes="*/build.xml" />
    </subant>
</target>

Wie geschrieben, wenn ein einzelnes Build fehlschlägt, scheitert die gesamte Veröffentlichung schnell (keines der späteren Builds wird erfolgreich sein). Wenn ich failonerror="false" einstelle, wird das All-Release immer erfolgreich sein. Es stellt sich heraus, dass alle Sub-Builds unabhängig sind, also was ich wirklich will ist:

alle Sub-Release-Builds auszuführen und anschließend All-Release fehlschlagen zu lassen, wenn eine oder mehrere Sub-Release-Builds fehlgeschlagen sind (idealerweise mit einer netten Fehlermeldung, welche Builds fehlgeschlagen sind).

Irgendwelche Ideen?

0 Stimmen

Wenn das Unterfreigabeziel erfolgreich ist, ist sein Lauf abgeschlossen. Mit Ant gibt es keine Möglichkeit, einen erfolgreichen Build nach einem fehlgeschlagenen Build zu erstellen.

3voto

martin clayton Punkte 74309

Ich schlage vor, Sie sehen sich die Erweiterungen an, die in der ant-contrib Aufgaben.

Die "for"-Aufgabe kann wahrscheinlich an Ihre Bedürfnisse angepasst werden.

Ihr "all-release"-Ziel mit der ant-contrib-Taskdef könnte wie folgt aussehen:

<taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
        <pathelement location="lib/ant-contrib-1.0b3.jar"/>
    </classpath>
</taskdef>

<target name="all-release">
    <for keepgoing="true" param="file">
        <path>
            <fileset dir="." includes="*/build.xml" />
        </path>
        <sequential>
            <ant antfile="@{file}" target="sub-release" />
        </sequential>
    </for>
</target>

Mit Hilfe einiger anderer Ant-Contrib-Funktionen kann es möglich sein, die Liste der Fehlschläge zu erhalten.

Beispielprotokoll aus obiger build.xml:

$ ant all-release
Buildfile: build.xml

all-release:
     [echo] /work/Scratch/dir1/build.xml

sub-release:
     [echo] dir1
     [echo] /work/Scratch/dir2/build.xml

sub-release:
     [echo] dir2
      [for] /work/Scratch/dir2/build.xml: The following error occurred while executing this line:
      [for] /work/Scratch/build.xml:17: The following error occurred while executing this line:
      [for] /work/Scratch/dir2/build.xml:6: dir2 failed
     [echo] /work/Scratch/dir3/build.xml

sub-release:
     [echo] dir3

BUILD FAILED
/work/Scratch/build.xml:11: Keepgoing execution: 1 of 3 iterations failed.

Total time: 0 seconds

0 Stimmen

Ich habe vor kurzem etwas Ähnliches gemacht und subant anstelle von ant call verwendet, was ist der Unterschied?

1voto

Peter Kofler Punkte 9018

Antilope Ant-Erweiterungen haben eine try-catch Befehl, der verwendet werden kann, um das zu erreichen, was Sie brauchen:

<taskdef name="try" classname="ise.antelope.tasks.TryTask"/>
....
<try break="false" printmessage="true" >
   <antcall target="xmlValidate" />
   <antcall target="runJunit" />
   <antcall target="..." />
   <catch>
      <property name="haderrors" value="true"/>
   </catch>
</try>
<fail message="FAILED" if="haderrors" />

break=false lassen Sie uns nach dem Fehlschlag mit dem nächsten Befehl fortfahren. Aber fehlgeschlagene Ziele setzen die haderrors Eigenschaft, die am Ende überprüft wird. Ich habe es oft für Bauaufträge verwendet (und es funktioniert gut), aber ich bin mir nicht sicher, ob es funktioniert für <fileset> innerhalb <subant> . Vielleicht müssen Sie alles auflisten <subant> explizit aufruft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X