2009-07-22 3 views

Antwort

90

Sie verwenden die available Aufgabe mit dem Typ "dir".

Zum Beispiel:

<available file="${dir}" type="dir"/> 

Der üblicher Weg bedingte Verarbeitung zu tun ist, mit den condition task. Im folgenden Beispiel wird beim Ausführen von doFoo eine Nachricht ausgegeben, wenn das Verzeichnis vorhanden ist, während beim Ausführen von doBar die Nachricht ausgegeben wird, es sei denn, ist das Verzeichnis vorhanden.

Das dir.check Ziel sowohl von doFoo und dobar erforderlich ist, setzt sich die dir.exists Eigenschaft auf wahr oder falsch, je nach dem Ergebnis der Aufgabe verfügbar. Das DoFoo-Ziel wird nur ausgeführt, wenn dieses Propery auf "True" gesetzt ist und DoBar nur ausgeführt wird, wenn es nicht auf "False" gesetzt oder auf "False" gesetzt ist.

<?xml version="1.0"?> 
<project name="test" default="doFoo" basedir="."> 
    <property name="directory" value="c:\test\directory"/> 

    <target name="doFoo" depends="dir.check" if="dir.exists"> 
    <echo>${directory} exists</echo> 
    </target> 

    <target name="doBar" depends="dir.check" unless="dir.exists"> 
    <echo>${directory} missing"</echo> 
    </target> 

    <target name="dir.check"> 
    <condition property="dir.exists"> 
     <available file="${directory}" type="dir"/> 
    </condition> 
    </target> 
</project> 

Antelope bietet zusätzliche Aufgaben, einschließlich einer If Aufgabe, die Verarbeitung einfacher (und mir, intuitiver) machen können, können Sie die Antelope Aufgaben aus dem download page herunterladen.

+1

Aber dies wird einen Eigenschaftswert auf wahr setzen. Wie soll ich dann den Zustand überprüfen? Ich meine jedes "wenn"? –

+0

Warum ist die Überprüfung dir.check nach doFoo und doBar? sollte nicht anders sein? @Rich Verkäufer –

29

Hier ist ein kleines Beispiel mit dem available Element in einen if Test.

<!-- Test if a directory called "my_directory" is present --> 
<if> 
    <available file="my_directory" type="dir" /> 
    <then> 
    <echo message="Directory exists" /> 
    </then> 
    <else> 
    <echo message="Directory does not exist" /> 
    </else> 
</if> 

Warnung: Sie müssen Ameisen contrib.jar in Ihrem ANT_HOME \ lib sonst werden Sie keinen Zugriff auf die if Elemente haben, und Ihr Skript mit diesem Fehler fehlschlagen:

Problem: failed to create task or type if 
Cause: The name is undefined. 
Action: Check the spelling. 
Action: Check that any custom tasks/types have been declared. 
Action: Check that any <presetdef>/<macrodef> declarations have taken place. 
+2

Ich mag die Einfachheit und Ausdruckskraft dieser Lösung. Es war das extra schwere Heben wert, um ant-contrib.jar installiert zu bekommen. –

8

Hier ist meine Lösung, die keine Eigenschaften Einstellung erfordert und unter Verwendung von Zielen mit ‚wenn‘ oder ‚es sei denn‘:

Macro:

<macrodef name="assertDirAvailable"> 
    <attribute name="dir" /> 
    <sequential> 
     <fail message="The directory '@{dir}' was expected to be available but is not"> 
      <condition> 
       <not> 
        <available file="@{dir}" type="dir" /> 
       </not> 
      </condition> 
     </fail> 
    </sequential> 
</macrodef> 

Verbrauch:

<assertDirAvailable dir="${dirToCheck}" /> 
+0

Schön! Vermeidet ant-contrib.jar, was eine gute Sache ist. Hält es eher deklarativ als prozedural. – cartland

+0

Korrektur allerdings: es sollte $ {artefactDir} nicht @ {artefactDir} sein. – cartland

+0

Ich habe dieses Verwendungsbeispiel von einem tatsächlichen Build-Skript kopiert, in dem artefactDir ein Attribut in einem Makrodef war. Ich habe das Anwendungsbeispiel in den möglicherweise häufiger verwendeten Fall der Übergabe eines Parameters anstelle eines macodef-Attributs geändert. Vielen Dank! – bcody

1

Meine Lösung ANT 1.8 Version, ältere Versionen können auf Grund funktionieren, wenn/es sei denn, nicht $ {evalTrueOrFalse} Syntax unterstützt.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="DoMagic" default="build" basedir="."> 

<property environment="env" /> 
<property name="name" value="Do the ANT Magic" /> 
<property name="somedir" value="./must_exist_folder"/> 
<tstamp><format property="TODAY" pattern="yyyy-MM-dd HH:mm:ss" /></tstamp> 

<target name="doMagic" if="${dir.exists}"> 
    <echo message="Do the magic stuff" /> 
</target> 

<target name="doUsage" unless="${dir.exists}"> 
    <echo message="Do usage and help" /> 
</target> 

<target name="build"> 
    <echo message="Do the magic" /> 

    <condition property="dir.exists" else="false"><available file="${somedir}" type="dir" /></condition> 
    <echo message="Folder found: ${dir.exists}" /> 
    <antcall target="doCustomize"></antcall> 
    <antcall target="doUsage"></antcall> 
</target> 

</project> 
  • ANT 1.6 oder frühen ANT 1.7 nicht funktioniert, ein Upgrade auf ANT 1.8 Release.
  • Zielattribute wenn und es sei denn, $ auswertet {var} Syntax true/false
  • Attribut Condition sonst Wert auf Eigentum gesetzt, wenn verfügbar Bedingung falsch war, ohne es Variable nicht gesetzt ist. NotSet-Wert ist nicht dasselbe wie ein expliziter falscher Wert.
  • Anruf jedes Ziel, aber wenn/es sei denn Attribut legt fest, ob seine tatsächlich

http://ant.apache.org/manual/properties.html#if+unless
laufen [If/Sofern] In Ant 1.7.1 und früher, nur diese Attribute Eigenschaftsnamen sein könnte. Ab Ant 1.8.0 können Sie stattdessen die Eigenschaftserweiterung verwenden. Im Vergleich zum älteren Stil bietet dies zusätzliche Flexibilität.

0

Hier ist ein weiterer Ansatz, erlaubt nur eine Aufgabe ohne ant-contrib.jar aufrufen.

<target name="my-task" depends="dir-check"> 
    <antcall target="my-task-install"/> 
    <antcall target="my-task-update"/> 
</target> 
<target name="my-task-install" unless="dir.exists" > 
    {some task} 
</target> 
<target name="my-task-update" if="dir.exists" > 
    {another task} 
</target> 
<target name="dir-check"> 
    <condition property="dir.exists"> 
     <available file="my-dir" type="dir" /> 
    </condition> 
</target>