2009-07-22 13 views

Respuesta

90

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.

+1

Pero esto establecerá un valor de propiedad como verdadero. Entonces, ¿cómo debo verificar la condición? Me refiero a cualquier "si"? –

+0

¿Por qué la verificación dir.check está después de doFoo y doBar? no debería ser de la otra manera? @Rich Seller –

29

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. 
+2

Me gusta la simplicidad y la expresividad de esta solución. Valió la pena levantar cosas extra para instalar ant-contrib.jar. –

8

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}" /> 
+0

¡Agradable! Evita ant-contrib.jar que es algo bueno. Lo mantiene declarativo en lugar de procesal. – cartland

+0

Corrección sin embargo: debe ser $ {artifactDir} not @ {artifactDir}. – cartland

+0

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

1

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> 
  • ANT 1.6 o principios de ANT 1.7 no funciona, actualice a ANT versión 1.8. atribuye
  • Objetivo si y menos que evalúa $ {var} sintaxis para falsa
  • atributo de verdadero/Condición valor demás se establece en la propiedad si está disponible condición era falsa, sin ella variable no está definida. El valor de NotSet no es lo mismo que un valor falso explícito.
  • llamada de cualquier objetivo, pero si/no ser atributo define si es en realidad dirigido

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.

0

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> 
Cuestiones relacionadas