¿Tarea Ant para ejecutar un objetivo Ant solo si existe un archivo?

Respuestas:

200

Disponible y condición

<target name="check-abc">
    <available file="abc.txt" property="abc.present"/>
</target>

<target name="do-if-abc" depends="check-abc" if="abc.present">
    ...
</target> 
kit de herramientas
fuente
8
Disponible es un nombre no tan obvio para lo que hace. Me confundí aún más por el hecho de que google muestra a las personas que escriben sus propias etiquetas
Mario Ortegón
puede funcionar, pero no parece una buena solución si necesita aplicar a una gran cantidad de archivos
cmcginty
44
En caso de que alguien se pregunte, los atributos ify unlesssolo habilitan o deshabilitan el objetivo al que están unidos, es decir, las dependencias del objetivo siempre se ejecutan. De lo contrario, no funcionaría depender de un objetivo que establezca la propiedad que está buscando.
sschuberth
Parece que <Available>está en desuso. He usado esto: <target name="do-if-abc" if="${file::exists('abc.txt')}"> ... </target> consulte: nant.sourceforge.net/release/0.85/help/functions/…
Loïc
1
@ Loïc 1: ¿ dónde dice que <available>está en desuso? 2: ${file::existst...} parece no funcionar con Ant (Apache ANT 1.9.7)
user85421
123

Esto podría tener un poco más de sentido desde una perspectiva de codificación (disponible con ant-contrib: http://ant-contrib.sourceforge.net/ ):

<target name="someTarget">
    <if>
        <available file="abc.txt"/>
        <then>
            ...
        </then>
        <else>
            ...
        </else>
    </if>
</target>
Adán
fuente
36
Esto solo está disponible en ant-contrib, creo.
Richard Cook
26

Desde Ant 1.8.0 aparentemente también hay recursos existentes

De http://ant.apache.org/manual/Tasks/conditions.html

Prueba un recurso para la existencia. desde Ant 1.8.0

El recurso real para probar se especifica como un elemento anidado.

Un ejemplo:

<resourceexists>
  <file file="${file}"/>
</resourceexists>

Estaba a punto de reelaborar el ejemplo de la buena respuesta anterior a esta pregunta, y luego encontré esto

A partir de Ant 1.8.0, puede utilizar la expansión de propiedad; un valor de verdadero (o activado o sí) habilitará el elemento, mientras que falso (o desactivado o no) lo desactivará. Todavía se supone que otros valores son nombres de propiedad y, por lo tanto, el elemento se habilita solo si se define la propiedad con nombre.

En comparación con el estilo anterior, esto le brinda flexibilidad adicional, ya que puede anular la condición desde la línea de comandos o los scripts principales:

<target name="-check-use-file" unless="file.exists">
    <available property="file.exists" file="some-file"/>
</target>
<target name="use-file" depends="-check-use-file" if="${file.exists}">
    <!-- do something requiring that file... -->
</target>
<target name="lots-of-stuff" depends="use-file,other-unconditional-stuff"/>

del manual de hormigas en http://ant.apache.org/manual/properties.html#if+unless

Esperemos que este ejemplo sea de utilidad para algunos. No están utilizando resourceexists, pero ¿presumiblemente podrías? .....

Jon Stafford
fuente
2
Tenga en cuenta que if="${file.exists}"debe reemplazarse por if="file.exists"as ify unlessverifique solo la existencia de la propiedad por nombre, no su valor.
Vadzim
1
@Vadzim Como se menciona en la respuesta, esto solo funciona en Ant 1.8, y 1.8 admite la expansión de propiedades. ant.apache.org/manual/properties.html#if+unless
Daniel Yankowsky
12

Creo que vale la pena hacer referencia a esta respuesta similar: https://stackoverflow.com/a/5288804/64313

Aquí hay otra solución rápida. Hay otras variaciones posibles en esto usando la <available>etiqueta:

# exit with failure if no files are found
<property name="file" value="${some.path}/some.txt" />
<fail message="FILE NOT FOUND: ${file}">
    <condition><not>
        <available file="${file}" />
    </not></condition>
</fail>
cmcginty
fuente
3

Marque Usar filtros de nombre de archivo como DB_*/**/*.sql

Aquí hay una variación para realizar una acción si existen uno o más archivos correspondientes a un filtro comodín. Es decir, no sabes el nombre exacto del archivo.

Aquí, estamos buscando archivos " * .sql " en cualquier subdirectorio llamado " DB_ * ", de forma recursiva. Puede ajustar el filtro a sus necesidades.

NB: Apache Ant 1.7 y superior!

Aquí está el objetivo para establecer una propiedad si existen archivos coincidentes:

<target name="check_for_sql_files">
    <condition property="sql_to_deploy">
        <resourcecount when="greater" count="0">
            <fileset dir="." includes="DB_*/**/*.sql"/>
        </resourcecount>
    </condition>
</target>

Aquí hay un objetivo "condicional" que solo se ejecuta si existen archivos:

<target name="do_stuff" depends="check_for_sql_files" if="sql_to_deploy">
    <!-- Do stuff here -->
</target>
David Robson
fuente
0

Puede hacerlo ordenando realizar la operación con una lista de archivos con nombres iguales a los nombres que necesita. Es mucho más fácil y directo que crear un objetivo especial. Y no necesita ninguna herramienta adicional, solo hormiga pura.

<delete>
    <fileset includes="name or names of file or files you need to delete"/>
</delete>

Ver: FileSet .

Gangnus
fuente