Wie überprüfe ich mit Ant, ob ein Ordner vorhanden ist?
Wir können die Existenz einer Datei überprüfen, aber können wir dasselbe auch für einen Ordner tun?
Wie überprüfe ich mit Ant, ob ein Ordner vorhanden ist?
Wir können die Existenz einer Datei überprüfen, aber können wir dasselbe auch für einen Ordner tun?
Antworten:
Sie verwenden die verfügbare Aufgabe mit dem Typ "dir".
Zum Beispiel:
<available file="${dir}" type="dir"/>
Die Standardmethode für die bedingte Verarbeitung ist die Bedingungsaufgabe . Im folgenden Beispiel wird beim Ausführen von doFoo eine Nachricht wiedergegeben, wenn das Verzeichnis vorhanden ist, während beim Ausführen von doBar eine Nachricht wiedergegeben wird, sofern das Verzeichnis nicht vorhanden ist.
Das Ziel dir.check wird sowohl von doFoo als auch von doBar benötigt. Es setzt die Eigenschaft dir.exists abhängig vom Ergebnis der verfügbaren Aufgabe auf true oder false. Das doFoo-Ziel wird nur ausgeführt, wenn diese Eigenschaft auf true gesetzt ist, und doBar wird nur ausgeführt, wenn es nicht auf false gesetzt oder 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 die Verarbeitung vereinfachen (und für mich intuitiver) kann. Sie können die Antelope-Aufgaben von der Download-Seite herunterladen .
depends
Attributen ab. Ich denke, es ist sauberer, sozusagen "öffentliche" Ziele oben und "private" Versorgungsziele unten zu setzen
Hier ist ein kleines Beispiel, in dem das available
Element in einen if
Test integriert wird.
<!-- 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 benötigen ant-contrib.jar in Ihrem Verzeichnis ANT_HOME \ lib, da Sie sonst keinen Zugriff auf die if
Elemente haben und Ihr Skript mit diesem Fehler fehlschlägt:
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.
Hier ist meine Lösung, bei der keine Eigenschaften festgelegt und Ziele mit "wenn" oder "außer" verwendet werden müssen:
Makro:
<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>
Verwendung:
<assertDirAvailable dir="${dirToCheck}" />
Bei meiner Lösung mit der ANT 1.8-Version funktionieren ältere Versionen möglicherweise nicht, wenn die Syntax $ {evalTrueOrFalse} nicht unterstützt wird.
<?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
[Wenn / Es sei denn] In Ant 1.7.1 und früheren Versionen konnten diese Attribute nur Eigenschaftsnamen sein. 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 anderer Ansatz, mit dem Sie nur eine Aufgabe aufrufen können, ohne ant-contrib.jar zu verwenden.
<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>
Hier ist ein weiteres Beispiel für eine for
Schleife. Fehler, wenn kein Verzeichnis vorhanden ist.
<for list="dir1/, dir2/, dir3/" param="local.dir" >
<sequential>
<fail message="Directory @{local.dir} does not exist">
<condition>
<not>
<available file="@{local.dir}" type="dir" />
</not>
</condition>
</fail>
</sequential>
</for>