¿Cómo verifico la existencia de una carpeta usando Ant?¿Tengo alguna forma de verificar la existencia de un directorio en Ant (no en un archivo)?
Podemos verificar la existencia de un archivo, pero ¿podemos hacer lo mismo para una carpeta también?
¿Cómo verifico la existencia de una carpeta usando Ant?¿Tengo alguna forma de verificar la existencia de un directorio en Ant (no en un archivo)?
Podemos verificar la existencia de un archivo, pero ¿podemos hacer lo mismo para una carpeta también?
Utiliza la tarea available con el tipo establecido en "dir".
Por ejemplo:
<available file="${dir}" type="dir"/>
La manera estándar para realizar el procesamiento condicional es con el condition task. En el siguiente ejemplo, al ejecutar doFoo se mostrará un mensaje si el directorio existe, mientras que al ejecutar doBar aparecerá el mensaje a menos que exista.
El objetivodir.check se requiere por tanto doFoo y dobar, establece el dir.exists propiedad a verdadero o falso dependiendo del resultado de la tarea disponibles. 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, incluyendo una tarea Si eso puede hacer que el procesamiento más simple (y para mí, más intuitivo), puede descargar las tareas del antílope de la download page.
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: se necesita hormiguero contrib.jar en su ANT_HOME \ lib de lo contrario no tendrá acceso a los elementos de if
, y la secuencia de comandos se producirá un error 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.
Me gusta la simplicidad y la expresividad de esta solución. Valió la pena levantar cosas extra para instalar ant-contrib.jar. –
aquí está mi solución, que no requiere la definición de las propiedades y el uso de objetivos con 'si' o 'menos':
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}" />
¡Agradable! Evita ant-contrib.jar que es algo bueno. Lo mantiene declarativo en lugar de procesal. – cartland
Corrección sin embargo: debe ser $ {artifactDir} not @ {artifactDir}. – cartland
Copié ese ejemplo de uso de un script de construcción real mío donde artifactDir era un atributo en un macrodef. Cambié el ejemplo de uso al caso posiblemente más común de pasar un parámetro en lugar de un atributo de macrodef. ¡Gracias! – bcody
Mi solución utilizando la versión ANT 1.8, las versiones anteriores puede no funcionar debido si/no apoyar a menos $ {} evalTrueOrFalse sintaxis.
<?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
[Si/A menos] En 1.7.1 Hormiga y anteriores, estos atributos sólo podían ser los nombres de propiedades. 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.
Aquí hay otro enfoque, permite llamar a una sola 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>
Pero esto establecerá un valor de propiedad como verdadero. Entonces, ¿cómo debo verificar la condición? Me refiero a cualquier "si"? –
¿Por qué la verificación dir.check está después de doFoo y doBar? no debería ser de la otra manera? @Rich Seller –