¿Existe una tarea ANT que ejecute un bloque solo si existe un archivo determinado? Tengo el problema de que tengo un script de hormiga genérico que debería hacer un procesamiento especial, pero solo si hay un archivo de configuración específico.
¿Existe una tarea ANT que ejecute un bloque solo si existe un archivo determinado? Tengo el problema de que tengo un script de hormiga genérico que debería hacer un procesamiento especial, pero solo si hay un archivo de configuración específico.
Respuestas:
<target name="check-abc">
<available file="abc.txt" property="abc.present"/>
</target>
<target name="do-if-abc" depends="check-abc" if="abc.present">
...
</target>
if
y unless
solo 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.
<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/…
<available>
está en desuso? 2: ${file::existst...}
parece no funcionar con Ant (Apache ANT 1.9.7)
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>
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? .....
if="${file.exists}"
debe reemplazarse por if="file.exists"
as if
y unless
verifique solo la existencia de la propiedad por nombre, no su valor.
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>
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>
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 .