Wie kann ich mit Ant auf das Vorhandensein eines Ordners prüfen?Kann ich die Existenz eines Verzeichnisses in Ant überprüfen (keine Datei)?
Wir können die Existenz einer Datei überprüfen, aber können wir das auch für einen Ordner tun?
Wie kann ich mit Ant auf das Vorhandensein eines Ordners prüfen?Kann ich die Existenz eines Verzeichnisses in Ant überprüfen (keine Datei)?
Wir können die Existenz einer Datei überprüfen, aber können wir das auch für einen Ordner tun?
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.
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.
Ich mag die Einfachheit und Ausdruckskraft dieser Lösung. Es war das extra schwere Heben wert, um ant-contrib.jar installiert zu bekommen. –
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}" />
Schön! Vermeidet ant-contrib.jar, was eine gute Sache ist. Hält es eher deklarativ als prozedural. – cartland
Korrektur allerdings: es sollte $ {artefactDir} nicht @ {artefactDir} sein. – cartland
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
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>
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.
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>
Aber dies wird einen Eigenschaftswert auf wahr setzen. Wie soll ich dann den Zustand überprüfen? Ich meine jedes "wenn"? –
Warum ist die Überprüfung dir.check nach doFoo und doBar? sollte nicht anders sein? @Rich Verkäufer –