scripting - representarse - que es un bit
¿Tengo alguna forma de verificar la existencia de un directorio en Ant(no en un archivo)? (5)
Aquí está mi solución, que no requiere establecer propiedades y usar objetivos con ''if'' o ''unless'':
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>
Uso:
<assertDirAvailable dir="${dirToCheck}" />
¿Cómo verifico la existencia de una carpeta usando Ant?
Podemos verificar la existencia de un archivo, pero ¿podemos hacer lo mismo para una carpeta también?
Aquí hay otro enfoque, permite llamar solo una tarea sin usar ant-contrib.jar.
<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>
Aquí hay un pequeño ejemplo que incorpora el elemento available
en una prueba if
.
<!-- 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>
Advertencia : necesitas ant-contrib.jar en tu directorio ANT_HOME / lib, de lo contrario no tendrás acceso a los elementos if
, y tu script fallará con este error:
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.
Es posible que mi solución con ANT versión 1.8 no funcione debido a que, a menos que no sea compatible con la sintaxis $ {evalTrueOrFalse}.
<?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 o early ANT 1.7 no funciona, actualice a ANT 1.8.
- Orientar atributos si y a menos que evalúe la sintaxis de $ {var} en verdadero / falso
- Condición atributo else valor se establece en propiedad si la condición disponible es falsa, sin ella no se establece la variable. El valor de NotSet no es lo mismo que un valor falso explícito.
- llamar a cualquier objetivo, pero si / menos atributo define si realmente se ejecuta
http://ant.apache.org/manual/properties.html#if+unless
[If / A menos] En Ant 1.7.1 y anteriores, estos atributos solo podrían ser nombres de propiedad. A partir de Ant 1.8.0, en su lugar puede utilizar la expansión de la propiedad. Comparado con el estilo anterior, esto le brinda flexibilidad adicional.
Utiliza la tarea available con el tipo establecido en "dir".
Por ejemplo:
<available file="${dir}" type="dir"/>
La forma estándar de hacer un procesamiento condicional es con la tarea de condición . En el siguiente ejemplo, al ejecutar doFoo se repetirá un mensaje si el directorio existe, mientras que al ejecutar doBar se repetirá un mensaje a menos que exista el directorio.
Tanto doFoo como doBar requieren el objetivo dir.check, establece la propiedad dir.exists en verdadero o falso según el resultado de la tarea disponible. El objetivo doFoo solo se ejecutará si esa propiedad se establece en verdadero y doBar solo se ejecutará si no está configurado o configurado en falso.
<?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 proporciona tareas adicionales, incluida una tarea If que puede hacer que el procesamiento sea más simple (y para mí, más intuitivo), puede descargar las tareas de Antelope desde la página de descarga .